我有一段代码,可以在一系列图像中找到Harris角。我需要对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循环迭代的其他限制的更多信息,请参见并行计算工具箱文档中的“变量分类”。
有什么办法解决这个问题吗?
谢谢!
发布于 2011-03-06 10:20:05
正如@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如果你不想让corners成为一个单元格数组(注意,要为第i个图像绘制角点,你可以调用imshow(images(:,:,i),[]),hold on, plot(cornerCell{i}(:,1),cornerCell{i}(:,2),'o')),你总是可以在一个循环中转换回原来的900 x 2 x n图像数组,这不会花费你任何明显的时间:
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-06 09:15:16
首先:
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是什么,但现在应该清楚问题是什么了。你能重写这段代码,这样你就不会把[]赋值给切片了吗?
https://stackoverflow.com/questions/5207667
复制相似问题