我有a
- by - b
单元格数组C
。在每个元素中,都有一个float数组。
我现在想要创建一个新的对称矩阵M
。 (i, j)
中的每个元素M
将被设置为C
中所有相应浮点数组的欧几里德距离之和。
例如,要查找M(i,j)
,我会在行b
的{{1}}中使用C
个浮点数组,以及i
的集合在行b
的{{1}}中浮点数组,找到两组中每个数组之间的欧几里德距离,然后求C
个值。 j
是列向量。所有列的长度都相同。
以下是我的"蛮力"执行这个:
b x b
我的问题:使用矩阵运算是否有更有效的方法,而不必依次显式计算每个欧几里德距离?
答案 0 :(得分:1)
最好使用3D数组,而不是使用相等大小的列向量的2D单元数组。
如果您有一个单元格数组:首先转换为3D数组(我的代码中为D
);然后用bsxfun
计算距离很容易;最后申请sum
:
D = permute(C, [3 1 2]);
D = reshape(cat(2, D{:}), [], size(C,1), size(C,2)); %// 3D array
dist = sqrt(sum(bsxfun(@minus, D, permute(D, [1 4 5 2 3])).^2)); %// distances
M = squeeze(sum(sum(dist, 3), 5)); %// sum of distances
示例:带
>> C = {[1; 2], [30; 40], [0; 1]; [5; 7] [19; 17] [4; 5]}; %// a is 2, b is 3
您的代码和我的代码的结果是
M =
196.8391 182.8791
182.8791 77.3002
答案 1 :(得分:0)
在计算欧几里德距离之前:
可以使用cell2mat将单元格数组转换为矩阵...然后你可以使用以下方法..
方法1:
G = rand(1, 72);
G2 = rand(1, 72);
D = sqrt(sum((G - G2) .^ 2));
方法2:
V = G - G2;
D = sqrt(V * V');
方法3:
D = norm(G - G2);
方法4:
D = pdist2(G,G2);
答案 2 :(得分:0)
我建议使用(:)
将矩阵元素转换为矢量,然后使用Matlab文件交换中的distance2curve.m
函数文件找到两个数组之间的最小/欧几里德距离。
假设两个单元格数组是A
和B
,矩阵包含每个单元格数组的行和列索引,表示为'indA'和'indB',其中'indA'中的每一行'indB'分别包含'A'和'B'的行元素和列元素。现在使用上面的函数:
[M, distance, t] = distance2curve(indA(:, :), indB(:, :))
输出变量M
应包含您要查找的两个数组之间的最小/欧几里德距离。