有效计算单元阵列之间的欧几里德距离

时间:2014-08-01 14:15:59

标签: matlab

我有a - by - b单元格数组C。在每个元素中,都有一个float数组。

我现在想要创建一个新的对称矩阵M(i, j)中的每个元素M将被设置为C中所有相应浮点数组的欧几里德距离之和。

例如,要查找M(i,j),我会在行b的{​​{1}}中使用C个浮点数组,以及i的集合在行b的{​​{1}}中浮点数组,找到两组中每个数组之间的欧几里德距离,然后求C个值。 j是列向量。所有列的长度都相同。

以下是我的"蛮力"执行这个:

b x b

我的问题:使用矩阵运算是否有更有效的方法,而不必依次显式计算每个欧几里德距离?

3 个答案:

答案 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函数文件找到两个数组之间的最小/欧几里德距离。

假设两个单元格数组是AB,矩阵包含每个单元格数组的行和列索引,表示为'indA'和'indB',其中'indA'中的每一行'indB'分别包含'A'和'B'的行元素和列元素。现在使用上面的函数:

[M, distance, t] = distance2curve(indA(:, :), indB(:, :))

输出变量M应包含您要查找的两个数组之间的最小/欧几里德距离。