我一直在尝试在Matlab中对for循环进行矢量化,因为它会影响整个程序,但我不知道如何在循环内单个矩阵的不同行或列上进行迭代时这样做。这是代码:
// X is an n*k matrix, W is n*n
// W(i,j) stores the norm of the vector resulting from subtracting
// the j-th line of X from its i-th line.
for i = 1:n
for j = 1:n
W(i,j) = norm(X(i,:) - X(j,:))
end
end
我选择路易斯·门多的答案,因为它对我来说最方便,而且更接近我的算法背后的数学概念,但所有三个答案都是正确的,我建议使用最方便的答案取决于您拥有哪些Matlab工具箱或您想要编码的方式。
我还注意到所有答案的共同点是使用不同的格式,例如:使用一个存储索引的数组,重新整形当前数组,再使用一个维... 所以如果你有类似的问题,我认为这是正确的。
答案 0 :(得分:2)
使用组合:
AudioTrack
答案 1 :(得分:1)
这是另一种可能对大型矩阵更有效的解决方案。
对于Matlab> = R2016,您可以简单地使用
W = sqrt(sum(abs(reshape(X,n,1,k) - reshape(X,1,n,k)).^2,3))
(如果您的数组是实数值,您也可以跳过abs)。对于早期版本的Matlab,您需要添加一些repmat魔法,即:
W = sqrt(sum(abs(repmat(reshape(X,n,1,k),[1,n,1]) - repmat(reshape(X,1,n,k),[n,1,1])).^2,3));
P.S。:R2017b可能会让它更方便,至少Image: updated JIRA issue with Labels提到了一个名为vecnorm
的函数,可以取代有点丑陋sqrt(sum(abs(.).^2)))
的东西。但是文档尚未完成,所以我不知道它究竟会做什么。 “
答案 2 :(得分:0)