在 MATLAB 中计算一个矩阵与另一个矩阵之间的差矩阵

Compute the difference matrix between a matrix and another matrix in MATLAB

在 matlab 中给定一个矩阵 A

3   1
4   5
7   8

和另一个矩阵B可以作为一些参考点(每行是参考点,要与A的每一行进行比较),

1   1
1   2

我需要计算一个矩阵 C,这样

 4    5
25   18
85   72

其中 C 的每一行是 A 的每一行与 B 的行之间的差异(平方 L2 范数)。在 MATLAB 中执行此操作的一种可能方法是首先创建一个零矩阵 CC = zeros(5,2),然后使用双 for 循环填充适当的值。在 MATLAB 中还有其他 efficient/simpler 方法吗?

找到下面的代码片段

C = zeros(5,2)
for i = 1:rows
    for j = 1:rows2
        C(i,j) =  (norm(A(i,:)-B(j,:)))^2
    end
end

也许你可以像下面那样尝试bsxfun

A = [3,1; 4,5;7,8];
B = [1,1;1,2];

% you can first rewrite A and B in complex coordinates to simplify the computation, and then compute difference of two complex values
C = abs(bsxfun(@minus,A*[1;1j],transpose(B*[1;1j]))).^2;

你会得到

C =

    4.0000    5.0000
   25.0000   18.0000
   85.0000   72.0000

类似于 的解决方案,但推广到任意数量的维度(=列)。 Thomas 的回答要求 AB 正好有 2 列才能使用复数表示。在这里,我们使用第 3 个数组维度而不是复数值:

n = 3; % number of spatial dimensions for computing the L2 norm
A = 10*rand(20,n);
B = 10*rand(4,n);
C = sum((reshape(A,[],1,n) - reshape(B,1,[],n)).^2,3)

首先我们重塑 A,使其行仍然是行,但其列沿第 3 个数组维度排列。我们类似地重塑 B,但它的行变成列,它的列移动到第 3 个维度。前两个维度的排列与输出 C.

的排列相匹配

接下来我们求差(使用隐式单例扩展,对于旧版本的 MATLAB,您需要使用 bsxfun)、平方和沿第 3 个维度求和。