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



给定 matlab 中的矩阵A

3   1
4   5
7   8

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

1   1
1   2

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

4    5
25   18
85   72

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

在下面找到代码片段

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

一个类似于ThomasIsCoding的解决方案,但推广到任意数量的维度(=列(。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 维求和。

也许你可以像下面这样尝试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

相关内容

  • 没有找到相关文章

最新更新