我必须遍历一个2D数组并对它们执行一些操作,具体取决于if
- 语句的结果。我在这里做了一个小例子:
N=128;
A = rand(N,N);
B = rand(N,N);
sqr = @(x) x.^2;
for xi=1:N
for yi=1:N
a = A(xi,yi);
b = B(xi,yi);
if( abs(a-b)<1 )
result=2.0;
else
result = sqr(a-b);
end
res_matrix(xi,yi) = result;
end
end
我想并行化for
- 循环。我已经在parfor
上阅读了MathWorks页面,我将它并行化的方式就是将外循环变为parfor
。
这是我能获得的最佳加速,还是应该以不同的方式构建我的循环?
这是我的循环的更详细版本:
for xi= 1:N
for yi= 1:N
a = A(:,xi,yi); %a is a vector
b = B(:,xi,yi); %b is a vector
D = a-b;
if( max(D./a)<1e-3 )
test_var=2.0;
else
F_min = F(a, b, 0); %F is some function, such as a Newton-Raphson solver etc...
F_max = F(a, b, 1); %F is some function, such as a Newton-Raphson solver etc...
if( F_min*F_max>0.0 )
test_var=2.0;
else
test_var = F(a, b, 2);
end
end
var(1, xi,yi) = test_var;
end
end
答案 0 :(得分:3)
我认为你可以减少代码(将两个for循环和if语句替换为):
C = abs(A-B);
D = ones(N);
R = sqrt(C);
idxC = bsxfun(@gt,C,D);
R(idxC) = 2.0;
首先计算条件abs(A,B)
,然后将比较应用于矩阵的所有元素。