- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用 MATLAB,想象一个 Nx6 的数字数组,它代表 N 个具有 3+3=6 个起始点和终点坐标的线段。
假设我有一个 function Calc_Dist( Segment_1, Segment_2 )
它将两个 1x6 数组作为输入,并且在一些操作之后返回一个标量,即这两个段之间的最小欧氏距离。
我想计算列表中所有 N 段之间的成对最小距离,但希望避免双循环。
我无法理解 bsxfun
的文档 MATLAB 的功能,所以我无法完成这项工作。为了一个最小的例子(距离计算显然不正确):
function scalar = calc_dist( segment_1, segment_2 )
scalar = sum( segment_1 + segment_2 )
end
和主要
Segments = rand( 1500, 6 )
Pairwise_Distance_Matrix = bsxfun( @calc_dist, segments, segments' )
有什么办法可以做到这一点,还是我被迫使用双循环?
谢谢你的建议
最佳答案
我想你需要pdist
而不是 bsxfun
。 pdist
有两种不同的使用方式,第二种适用于您的问题:
具有内置距离函数,以字符串形式提供,例如 'euclidean'
、'hamming'
等。
使用自定义距离函数,您提供的句柄。
第二种情况,距离函数
must be of the form
function D2 = distfun(XI, XJ),
taking as arguments a
1
-by-N
vectorXI
containing a single row ofX
, anM2
-by-N
matrixXJ
containing multiple rows ofX
, and returning anM2
-by-1
vector of distancesD2
, whoseJ
th element is the distance between the observationsXI
andXJ(J,:)
.
虽然文档没有说明,但第二种方法很可能不如第一种有效(双循环甚至可能更快,谁知道呢),但您可以使用它。您需要定义您的函数,使其满足规定的条件。使用您的示例函数很容易:对于这部分您将使用 bsxfun
:
function scalar = calc_dist( segment_1, segment_2 )
scalar = sum(bsxfun(@plus, segment_1, segment_2), 2);
end
还要注意
pdist
处理行(而不是列),这正是您所需要的。pdist
通过利用任何距离函数必须具有的属性来减少操作。即,已知元素到自身的距离为零;由于对称性,每对的距离可以只计算一次。如果你想以矩阵的形式排列输出,使用squareform
.因此,在你的实际距离函数被适当修改后(这可能是最难的部分),使用:
distances = squareform(pdist(segments, @calc_dist));
例如:
N = 4;
segments = rand(N,6);
distances = squareform(pdist(segments, @calc_dist));
产生
distances =
0 6.1492 7.0886 5.5016
6.1492 0 6.8559 5.2688
7.0886 6.8559 0 6.2082
5.5016 5.2688 6.2082 0
关于MATLAB:bsxfun 不清楚。想要加速线段之间的最小距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26218334/
我有一个二元函数,大致看起来像 func=@(i,j)exp(-32*(i-j)^2); 网格如下 [X Y]=meshgrid(-10:.1:10); 奇怪的是,arrayfun 会产生正确的结果,
这是做什么的? u = [5 6]; s = [1 1]; data1 =[randn(10,1) -1*ones(10,1)]; data2 =[randn(10,1) ones(10,
在 Matlab R2016a 中,我有一大组成对的小 X 向量和 Y 向量(例如,10,000 个 1x3 X 向量与 10,000 个 1x3 Y 向量配对)。对于每个 {X,Y} 对,我想为 X
我有两组(50 个训练和 25 个测试)大小为 42 的直方图集。(这些数字是任意的,它们在现实中会更大,所以我正在寻找一种有效的方法。而且约定可能是相反的在转置方面,请随意使用任何约定 [featu
我主要使用 bsxfun 对我的代码进行矢量化,但我遇到了一个我无法完全破解的场景。这是一个小问题示例。我想删除此代码中的 for 循环,但我很难处理 tempEA 行。 Index = [2; 3;
这里主要想研究两点- bsxfun 有六个内置关系运算:@eq (equal)、@ne(不等于)、@lt(小于)、 @le(小于或等于)、@gt(大于) 和 @ ge(大于或等于)。很多时候我们将它们
我有一个问题。我正在尝试实现这段简短的代码。 我已经完成了基本步骤。请在下面检查我的代码: clc;clear all;close all; A=round(-3+(6).*rand(5,5)); B
我想将逐个元素的二元运算应用于大型逻辑向量。这些向量的内容是错误的,因此出于性能考虑,最好使用稀疏矩阵。如果我这样做,结果矩阵是不正确的。 例子 A = logical([0;1;0;0]); B =
我正在做一个关于神经网络的项目,我的工作介质是 Matlab。运行以下代码时: net=train(net, feat_mat, gt_mat); 我使用的神经网络是具有 3 个隐藏层的 ffnn。
假设我有 2 个向量,我想做一个外积。我可以使用: A=x*y'; 或者我可以像这样使用bsxfun: bsxfun(@times,x,y') 但我想批量生产外部产品。我有 2 个矩阵,每个矩阵都包含
我在 MATLAB 中有两个数组: A; % size(A) = [NX NY NZ 3 3] b; % size(b) = [NX NY NZ 3 1] 事实上,在三维域中,我为每个 (i, j,
在尝试理解 bsxfun 函数后,我尝试在脚本中实现它以避免循环。我试图检查数组中的每个单独元素是否包含在一个矩阵中,返回一个与分别包含 1 和 0 的初始数组大小相同的矩阵。我创建的匿名函数是: m
我正在使用 bsxfun在大小矩阵之间通过单例扩展对操作进行矢量化: MS: (nms, nls) KS: (nks, nls) 运算是对每个值的绝对差求和MS(m,l)与 m在1:nms和 l在1:
使用 MATLAB,想象一个 Nx6 的数字数组,它代表 N 个具有 3+3=6 个起始点和终点坐标的线段。 假设我有一个 function Calc_Dist( Segment_1, Segment
对于非数字数据,是否有等价于 bsxfun 的方法? 例如,我想比较存储在两个元胞数组中的所有字符串对: >> a = {'aa', 'bb', 'cc'}; >> b = {'dd', 'aa'};
我需要将矩阵 A 与 n 个矩阵相乘,然后得到 n 矩阵。例如,将 2x2 矩阵与 3 个堆叠为 2x2x3 Matlab 数组的 2x2 矩阵相乘。 bsxfun 是我通常在这种情况下使用的,但它只
在我的工作(计量经济学/统计学)中,我经常需要将不同大小的矩阵相乘,然后对生成的矩阵执行其他操作。我一直依靠 bsxfun() 来矢量化代码,总的来说我发现它比 repmat() 更有效。但我不明白的
一如既往地想向您学习更多信息,我希望我能在以下代码方面得到一些帮助。 我需要完成以下任务: 1) 我有一个向量: x = [1 2 3 4 5 6 7 8 9 10 11 12] 2) 和一个矩阵:
我有一个 double 的 2092x252 矩阵s 并且需要创建一个 for使用 bsxfun 的循环.对于这个例子,我们只说bsxfun(@minus) .我需要循环完成的是运行 bsxfun(@
从 bsxfun 的 Matlab 文档中给出了一个示例: fun = @(A,B) A.*sin(B); A = 1:7; B = pi*[0 1/4 1/3 1/2 2/3 3/4 1].'; %
我是一名优秀的程序员,十分优秀!