如何在matlab中更快地完成这个循环

时间:2013-11-21 10:00:38

标签: performance matlab

我必须逐个元素地将数组AB相乘,并计算第一个维度的总和,然后在C中返回结果。 A是一个N - by - M - by - L矩阵。 B是一个N - by - 1 - by - L矩阵。 NM低于30,但L非常大。我的代码是:

C=zeros(size(B));
parfor i=1:size(A,2)
    C(i,1,:) = sum(bsxfun(@times, A(:,i,:), B(:,1,:)), 1);
end

问题是代码很慢,任何人都可以帮助使代码更快?非常感谢你。

3 个答案:

答案 0 :(得分:0)

如何做到这一点:

C = permute(sum(A.*repmat(B,1,M)),[2,1,3]);

这使我的电脑计算速度提高了约4倍。有趣的是,只需将parfor循环更改为for循环,您实际上可以将计算速度提高2倍(至少在我的PC上)。

答案 1 :(得分:0)

根据路易斯·门多的评论,我建议使用这个命令:

C=reshape(sum(bsxfun(@times, A, B), 1), size(B))

我认为这是最快的。

答案 2 :(得分:0)

如果我理解正确,请执行此操作:

C = squeeze(sum(bsxfun(@times, A, B)));

这使得C的大小为M x L.