在下面的代码中,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
答案 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;