给定 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 中执行此操作的一种可能方法是首先创建一个零矩阵C
、C = 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 的回答要求A
和B
正好有 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