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 在 parfor 函数中运行循环,方法是将循环迭代分成组,然后将它们发送给并行运行的 MATLAB 工作程序。为了使 MATLAB 以可重复、可靠的方式执行此操作,它必须能够对循环中使用的所有变量进行分类。该代码以与分类不兼容的方式使用指示的变量。建议的操作 修复指示变量的使用。有关变量分类和 parfor 循环迭代的其他限制的更多信息,请参阅 Parallel Computing Toolbox 文档中的“变量分类”。

任何想法如何解决这一问题?

谢谢!

4

2 回答 2

8

正如@Chris所提到的,这条线

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

是问题所在。确保角可切片的一种简单方法是使用元胞数组

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×2×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
于 2011-03-06T02:20:04.550 回答
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(结束 + 1) = i;

在这两种情况下都没有对 A 进行切片的原因是因为更改切片数组的形状会违反管理客户端和工作人员之间通信的假设。

我对 x 和 y 是什么没有很好的感觉,但现在应该清楚问题是什么了。您可以重写它以便不将 [] 分配给切片吗?

于 2011-03-06T01:15:15.747 回答