Matlab parfor未分类的变量

时间:2020-07-08 03:11:24

标签: matlab parfor

以下代码根据向量v计​​算A的矩阵元素。由于parfor的维数很大,我尝试使用v来加快计算速度。我收到错误消息“ A中的变量parfor无法分类。”。关于如何解决问题有什么建议吗?

A = zeros(n,n);
for kk = 1:D
    % sk = <expressions...>
    % ek = <expressions...>
    parfor ll = 1:D
        % sl = <expressions...>
        % el = <expressions...>
        if (ek == el)
            A(sk,sl) = A(sk,sl) + v(kk) * v(ll);
        end
    end
end

2 个答案:

答案 0 :(得分:0)

问题是您将A分布在不同的内核上,但自行调整了其值。核心应如何知道条目A(sk,sl)在其他核心上未更改?它需要检查这一点,与所有其他内核通信,消除任何并行计算,这就是MATLAB抱怨的原因: MATLAB complaint

您可以通过在A循环之外创建parfor的副本来避免此问题

A = zeros(n,n);
B = A;
for kk = 1:D
    % sk = <expressions...>
    % ek = <expressions...>
    parfor ll = 1:D
        % sl = <expressions...>
        % el = <expressions...>
        if (ek == el)
            B(sk,sl) = A(sk,sl) + v(kk) * v(ll);
        end
    end
end

答案 1 :(得分:0)

您可以这样将其表示为A上方的"reduction"

parfor ll 1:D
    % compute stuff...

    % Make a new matrix for the increment
    Aincrement = zeros(n, n);
    % Fill out the element of the increment
    Aincrement(sk, sl) = v(kk) * v(ll);
    % Increment the whole of A so that parfor can 
    % treat A as a reduction variable
    A = A + Aincrement;
end

如果n大,则效率可能很低。