我有一段代码可以在一系列图像中找到哈里斯的角落。我需要为92张图片执行此操作,但速度相当慢。因此,我想并行运行代码。我下面的代码有一个与变量“corner”相关的错误
%% 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循环迭代的其他限制的更多信息,请参阅并行计算工具箱文档中的“变量分类”。
任何想法如何解决这个问题?
谢谢!
答案 0 :(得分: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 x 2循环中的by-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
答案 1 :(得分: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没有很好的感觉,但现在应该清楚问题是什么。你可以重写这个,这样你就不会将[]分配给切片吗?