0

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

parfor 中的变量this_volume无法分类。

据我了解,我只是将变量同时用作切片输入和输出变量,因为我正在为其中的一些元素赋值。我不确定这两个额外的 for 循环parfor是否是问题的原因。我将不胜感激任何建议。

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
4

1 回答 1

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;
于 2014-06-07T20:21:52.240 回答