我在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
答案 0 :(得分:4)
尝试用以下代码替换循环:
T1 = A'*t;
T2 = bsxfun(@times, A'*B, permute(t,[3 1 2]));
置换的原因是因为bsxfun
会沿着单个维度扩展矩阵,因此您需要确保矩阵沿着正确的维度扩展。如果给bsxfun
一个行向量和一个矩阵,它会尝试对行向量和矩阵的每一行进行逐元素乘法。但我们想要的是将整个矩阵与向量的每个元素相乘,但沿着新的正交维度。因此置换将矢量从行向量更改为3D矢量,从而允许bsxfun
沿正确的维度展开。
但是,您还应首先使用T1
尝试仅pre-allocate memory T2
和zeros
,即在您的循环尝试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