在AlphaLAB中将arrayfun输出到矩阵的trid维度

时间:2018-03-17 12:50:01

标签: arrays matlab performance computation

假设我有一个矩阵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

但是,我关注速度,并且想请你帮忙告诉我如何在不使用循环的情况下实现它。我很可能需要使用bsxfunarrayfunrowfun,但我不确定。 感谢所有答案。

2 个答案:

答案 0 :(得分:1)

Componentarrayfun在我的尝试中没有加快计算速度,如下所示:

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版本在循环中不再慢。我认为循环更具可读性,值得使用更易读的代码,或者至少将循环保留在注释中以阐明矢量化代码的作用。