MATLAB parfor切片问题?

8

我有一段代码,可以在一系列图像中找到哈里斯角。 我需要对92个图像执行此操作,但速度相当慢。 因此,我希望并行运行代码。 下面的代码存在与变量“corners”相关的错误。

%% Harris corners
    max_pts = 900;
    corners = zeros(max_pts,2,size(images,3));
    parfor i = 1:size(images,3)
        I = images(:,:,i);
        [y x] = get_corners(I,max_pts);
        corners(1:length(y),:,i) = [y x];
    end

这段话的意思是:

MATLAB通过将循环迭代分组并将其发送到MATLAB工作器中以并行运行来运行parfor函数中的循环。为了使MATLAB能够以可重复、可靠的方式执行此操作,它必须能够对循环中使用的所有变量进行分类。代码使用指定的变量的方式与分类不兼容。

建议操作 修复所指示的变量的用法。 有关变量分类和对parfor循环迭代的其他限制的更多信息,请参阅“Parallel Computing Toolbox文档中的“变量分类”。

有什么想法如何解决这个问题吗?

谢谢!

2个回答

8

正如@Chris所提到的,这行代码

corners(1:length(y),:,i) = [y x];

问题出在这里。确保角落可被切片的简单方法是使用一个cell数组。

max_pts = 900;
cornerCell = cell(size(images,3),1);
parfor i = 1:size(images,3)
    I = images(:,:,i);
    [y x] = get_corners(I,max_pts);
    cornerCell{i} = [y x];
end

如果您不想将角落转换成单元数组(请注意,要为第i张图绘制角落,您可以调用imshow(images(:,:,i),[]),hold on,plot(cornerCell {i}(:,1),cornerCell {i}(:,2),'o')),您始终可以通过循环将其转换回原始的900 x 2 x nImages数组,这不会花费您任何明显的时间:

corners = zeros(max_pts,2,size(images,3));
for i=1:size(images,3)
   corners(1:size(cornerCell{i},1),:,i) = cornerCell{i};
end

这个数组图像能否扩展到N维?比如说,您可以指定对第M维进行切片,以便获取图像(:,:,1,1,1,1,:,1,1,1),其中第三个冒号在第M个位置。 - Leo
1
@Leo:不,切片操作始终沿着最后一个维度进行。但是,使用“permute”函数,您可以根据需要移动维度。 - Jonas

2

首先:

  corners(1:length(y),:,i) = [y x];

这是问题所在的代码行。

你有没有阅读文档?

http://www.mathworks.com/help/toolbox/distcomp/brdqtjj-1.html#bq_tcng-1

数组形状 - 在对切片变量进行赋值时,赋值语句右侧不能为[]或''(这些运算符表示删除元素)。

数组形状。切片变量必须保持恒定的形状。下面的A变量不是切片:

A(i,:) = []; A(end + 1) = i;

之所以A在任一情况下都不是切片,是因为改变切片数组的形状会违反控制客户端和工作进程间通信的假设。

我不太了解x和y是什么,但现在应该清楚问题所在了。你能否重写代码,使其不将[]赋值给切片?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接