poster
2019-12-14, 20:13
我有一段代码可以在一系列图像中找到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); [yx] = get_corners(I,max_pts); corners(1:length(y),:,i) = [yx]; end 其中说:
MATLAB在parfor函数中运行循环,方法是将循环迭代分为几组,然后将其发送给并行运行的MATLAB worker。为了使MATLAB以可重复,可靠的方式执行此操作,它必须能够对循环中使用的所有变量进行分类。代码以与分类不兼容的方式使用指示的变量。建议的操作修正所指示变量的用法。有关变量分类和parfor循环迭代的其他限制的更多信息,请参见Parallel Computing Toolbox文档中的“变量的分类”。
任何想法如何解决这一问题?
谢谢!
回答:
如@Chris所述 (https://stackoverflow.com/questions/5207667/matlab-parfor-slicing-issue/5207977#5207977) ,该行
corners(1:length(y),:,i) = [yx]; 是问题。确保角是可切片的一种简单方法是使用单元格数组
max_pts = 900; cornerCell = cell(size(images,3),1); parfor i = 1:size(images,3) I = images(:,:,i); [yx] = get_corners(I,max_pts); cornerCell{i} = [yx]; 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
更多&回答... (https://stackoverflow.com/questions/5207667)
%% Harris corners max_pts = 900; corners = zeros(max_pts,2,size(images,3)); parfor i = 1:size(images,3) I = images(:,:,i); [yx] = get_corners(I,max_pts); corners(1:length(y),:,i) = [yx]; end 其中说:
MATLAB在parfor函数中运行循环,方法是将循环迭代分为几组,然后将其发送给并行运行的MATLAB worker。为了使MATLAB以可重复,可靠的方式执行此操作,它必须能够对循环中使用的所有变量进行分类。代码以与分类不兼容的方式使用指示的变量。建议的操作修正所指示变量的用法。有关变量分类和parfor循环迭代的其他限制的更多信息,请参见Parallel Computing Toolbox文档中的“变量的分类”。
任何想法如何解决这一问题?
谢谢!
回答:
如@Chris所述 (https://stackoverflow.com/questions/5207667/matlab-parfor-slicing-issue/5207977#5207977) ,该行
corners(1:length(y),:,i) = [yx]; 是问题。确保角是可切片的一种简单方法是使用单元格数组
max_pts = 900; cornerCell = cell(size(images,3),1); parfor i = 1:size(images,3) I = images(:,:,i); [yx] = get_corners(I,max_pts); cornerCell{i} = [yx]; 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
更多&回答... (https://stackoverflow.com/questions/5207667)