假设我有一个矩阵A = rand(n,m)
。我想计算大小为n x n x m的矩阵B,其中B(:,:,i) = A(:,i)*A(:,i)';
可以产生这个的代码非常简单:
A = rand(n,m); B = zeros(n,n,m);
for i=1:m
B(:,:,i) = A(:,i)*A(:,i)'
end
但是,我关注速度,并且想请你帮忙告诉我如何在不使用循环的情况下实现它。我很可能需要使用bsxfun
,arrayfun
或rowfun
,但我不确定。
感谢所有答案。
答案 0 :(得分:1)
Component
和arrayfun
在我的尝试中没有加快计算速度,如下所示:
bsxfun
答案 1 :(得分:1)
我现在没有MATLAB,但我认为这段代码应该产生与你的循环相同的结果:
A1 = reshape(A,n,1,m);
A2 = reshape(A,1,n,m);
B = bsxfun(@times,A1,A2);
如果你有更新版本的MATLAB,你不再需要bsxfun
,你可以写
B = A1 .* A2;
在旧版本中,最后一行会显示错误消息。
这是否比你的循环更快取决于MATLAB的版本。较新的MATLAB版本在循环中不再慢。我认为循环更具可读性,值得使用更易读的代码,或者至少将循环保留在注释中以阐明矢量化代码的作用。