首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB parfor切片问题?

MATLAB parfor切片问题?
EN

Stack Overflow用户
提问于 2011-03-06 08:00:21
回答 2查看 7.1K关注 0票数 8

我有一段代码,可以在一系列图像中找到Harris角。我需要对92张图像执行此操作,但速度相当慢。因此,我希望并行运行代码。下面的代码有一个与变量"corners“相关的错误。

代码语言:javascript
复制
%% 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循环迭代的其他限制的更多信息,请参见并行计算工具箱文档中的“变量分类”。

有什么办法解决这个问题吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-06 10:20:05

正如@Chris所提到的,这行

代码语言:javascript
复制
corners(1:length(y),:,i) = [y x];

才是问题所在。确保边角可切分的一个简单方法是使用单元数组

代码语言:javascript
复制
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图像数组,这不会花费你任何明显的时间:

代码语言:javascript
复制
corners = zeros(max_pts,2,size(images,3));
for i=1:size(images,3)
   corners(1:size(cornerCell{i},1),:,i) = cornerCell{i};
end
票数 8
EN

Stack Overflow用户

发布于 2011-03-06 09:15:16

首先:

代码语言:javascript
复制
  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是什么,但现在应该清楚问题是什么了。你能重写这段代码,这样你就不会把[]赋值给切片了吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5207667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档