并行化包含if语句的for循环

时间:2015-08-24 13:10:37

标签: matlab parallel-processing parfor

我必须遍历一个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

1 个答案:

答案 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),然后将比较应用于矩阵的所有元素。