在MATLAB中为循环并行变量分类时出错

时间:2014-06-07 20:11:14

标签: matlab parallel-processing parfor

在下面的代码中,M1是一个4d矩阵。我在运行此代码时收到的错误消息是:

  

parfor中的变量this_volume无法归类。

根据我的理解,我只是同时使用变量作为切片输入和输出变量,因为我正在为它的某些元素赋值。我不确定parfor之后的两个额外for循环是否是导致问题的原因。我会很感激任何建议。

tic

fill_thresh = 12;

for a_fill = 1:size_M1(4)

    this_volume = M1(:,:,:,a_fill);
    this_volume_copy = this_volume;
    parfor b_fill = 1:size_M1(3)        
       fill_factor = zeros(size_M1(1),size_M1(2));
       for c_fill = 1+2:size_M1(1)-2
            for d_fill = 1+2:size_M1(2)-2                
            fill_factor(c_fill,d_fill) = sum(sum(this_volume_copy(c_fill-2:c_fill+2,d_fill-2:d_fill+2,b_fill )));
                if fill_factor(c_fill,d_fill ) > fill_thresh
                    this_volume(c_fill,d_fill,b_fill ) = 1;
                end
            end
        end        
    toc
    end
    M1(:,:,:,a_fill) = this_volume;
    toc
end

1 个答案:

答案 0 :(得分:0)

理论上,this_volume是一个切片变量,但是matlab不会识别这个,因为你将它包装在一些高级索引和循环中。典型的技术是使用直接表示切片的临时变量:

this_volume = M1(:,:,:,a_fill);
this_volume_copy = this_volume;
parfor b_fill = 1:size_M1(3)        
   fill_factor = zeros(size_M1(1),size_M1(2));
   %get the full slice of this_volume
   helper=this_volume(:,:,b_fill );
   for c_fill = 1+2:size_M1(1)-2
        for d_fill = 1+2:size_M1(2)-2
            fill_factor(c_fill,d_fill) = sum(sum(this_volume_copy(c_fill-2:c_fill+2,d_fill-2:d_fill+2,b_fill )));
            if fill_factor(c_fill,d_fill ) > fill_thresh
                helper(c_fill,d_fill) = 1;
            end
        end
   end
   %write back the full slice
   this_volume(:,:,b_fill )=helper;
end
M1(:,:,:,a_fill) = this_volume;
相关问题