避免for循环以提高性能

时间:2016-10-25 10:01:43

标签: matlab performance for-loop optimization

是否可以以比使用for循环更有效的方式获取矩阵A

a = 6;  % constant
b = 2;  % constant
s = 0.1; % possible to change
I = 12; % possible to change

A = zeros(a,I+1);    
A(:,1) = rand(a,1); % some initial value 
B = rand(b,I);

% possible to avoid for-loop to increase performance?
for i = 1:I
    A(:,i+1) = fun(A(:,i),B(:,i), a, s);
end

功能乐趣为

function [AOut] = fun(AIn, B, a, s)
    AOut = zeros(a,1);
    AOut(1) = AIn(1) + AIn(4)*s*cos(AIn(3));
    AOut(2) = AIn(2) + AIn(4)*s*sin(AIn(3));
    AOut(3) = AIn(3) + AIn(4)*AIn(6)*s;
    AOut(4) = AIn(4) + AIn(5)*s;
    AOut(5) = AIn(5) + B(1);
    AOut(6) = AIn(6) + B(2);
end

2 个答案:

答案 0 :(得分:1)

首先,如果a != n

您将收到错误消息:

  

订阅的分配维度不匹配。

所以你必须谨慎

而且,要摆脱循环,你可以这样做:

编辑: 显然我没有在右侧进行修改。我会尝试修复它并重新编写我的答案。

无论如何,要摆脱循环,你仍然可以使用A(:, i:1:I)

i = 1;
A(:, i:1:I) = fun(A(:,i),B(:,i), a, s);

如果您还有其他问题,请询问!

答案 1 :(得分:1)

我认为你不能在效率方面优化循环,因为计算下一个需要最后的值。 @Tony Tannous向您展示了如何摆脱代码中的循环的好方法。为了在gtk-theme-name = MS-Windows 的高值下获得更好的性能,您可以将fun()更改为:

I