如何在matlab中加速这个三重循环

时间:2014-01-28 09:47:07

标签: matlab

我在matlab中有一个三重嵌套for循环,需要花费大量时间来解决它。您有什么建议我如何加快模拟速度?这种特定的模拟速度很快,但在实际代码中,'t'有千元,A和B有400元素。

A = [1,2,3];
B = [1,2];
t=[1:1:4];
or hh = 1:length(t)
    for ii = 1:length(A)
        T1(ii,hh)=A(ii)*t(hh)
            for jj = 1:length(B)
                T2(ii,jj,hh)=A(ii)*B(jj)*t(hh)
            end
    end
end

T1_part=sum(T1);
T2_part1=sum(sum(T2));
T2_part2=T2_part1(:,:);
T_final=T1_part+T2_part2

结果: T_final =

24    48    72    96

2 个答案:

答案 0 :(得分:4)

尝试用以下代码替换循环:

T1 = A'*t;
T2 = bsxfun(@times, A'*B, permute(t,[3 1 2]));

置换的原因是因为bsxfun会沿着单个维度扩展矩阵,因此您需要确保矩阵沿着正确的维度扩展。如果给bsxfun一个行向量和一个矩阵,它会尝试对行向量和矩阵的每一行进行逐元素乘法。但我们想要的是将整个矩阵与向量的每个元素相乘,但沿着新的正交维度。因此置换将矢量从行向量更改为3D矢量,从而允许bsxfun沿正确的维度展开。

但是,您还应首先使用T1尝试仅pre-allocate memory T2zeros,即在您的循环尝试T2 = zeros(size(A,2), size(B,2), size(t,2))之前。在使用循环时,您应该始终预先分配。

答案 1 :(得分:0)

对于T1和T2,你可以使用两个向量的元素乘积,它给你一个矩阵:

A = [1,2,3];
B = [1,2];

> T1=B'*A

T1 =

     1     2     3
     2     4     6