MATLAB parfor切片问题?

Bra*_*ers 8 matlab parfor

我有一段代码可以在一系列图像中找到哈里斯的角落.我需要为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
Run Code Online (Sandbox Code Playgroud)

哪个说:

MATLAB通过将循环迭代分成组,然后将它们发送到并行运行的MATLAB工作程序,在parfor函数中运行循环.为了使MATLAB以可重复,可靠的方式执行此操作,它必须能够对循环中使用的所有变量进行分类.代码以与分类不兼容的方式使用指示的变量.建议的操作修复指示变量的使用.有关变量分类和parfor循环迭代的其他限制的更多信息,请参阅并行计算工具箱文档中的"变量分类".

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

谢谢!

Jon*_*nas 8

如所提到的由@克里斯,线

corners(1:length(y),:,i) = [y x];
Run Code Online (Sandbox Code Playgroud)

是问题.确保角落可切割的简单方法是使用单元阵列

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
Run Code Online (Sandbox Code Playgroud)

如果您不希望角落成为单元格数组(请注意,为了绘制第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
Run Code Online (Sandbox Code Playgroud)