首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在matlab中纠正“变量的有效索引在PARFOR循环中受到限制”错误

如何在matlab中纠正“变量的有效索引在PARFOR循环中受到限制”错误
EN

Stack Overflow用户
提问于 2018-06-09 00:43:40
回答 2查看 1.1K关注 0票数 2

我正在尝试在MatLab R2016a中设置一个parfor嵌套循环,如下所示。

代码语言:javascript
复制
N = size(A,1);
M = size(v,1);
in = zeros(N*M,1);
parfor i=1:N
   for j=1:M
      k = (i-1)*M+j;
      if sqrt(sum((A(i,:)-v(j,:)).^2))<=tol
        in(k) = i;          
      end
   end
end

然而,我得到了下面的错误, ' in‘的有效索引在PARFOR循环中受到限制。有没有办法纠正这个问题,因为数组Av都相当大,A超过40,000行,v超过8,000行?变量tol为0.0959。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-12 01:27:38

问题是MATLAB没有识别出变量k对矩阵in进行了正确的切片。解决方案应该是分别使用ijin进行索引:

代码语言:javascript
复制
N = size(A,1);
M = size(v,1);
in = zeros(M,N);
parfor i=1:N
   for j=1:M
      if sqrt(sum((A(i,:)-v(j,:)).^2))<=tol
        in(j,i) = i;          
      end
   end
end
in = in(:); % reshape to a column vector, as the output in the question's code

另一种选择,但它需要更多的中间内存,是计算这个根本没有循环:

代码语言:javascript
复制
A = reshape(A,1,N,[]);
v = reshape(v,M,1,[]);
in = sum(bsxfun(@minus,A,v).^2,3) < tol*tol;
in = in(:);

(或者类似的东西,我还没有运行这段代码...如果有打字错误或其他错误,请让我知道,或修复帖子。)

票数 1
EN

Stack Overflow用户

发布于 2018-06-11 06:05:37

代码语言:javascript
复制
N = size(A,1);
M = size(v,1);
in = cell(N,1);
parfor i=1:N
    s=v;
    p=zeros(1:M,1);
   for j=1:M
      k = (i-1)*M+j;
      if sqrt(sum((A(i,:)-s(j,:)).^2))<=tol
        p(k) = i;          
      end
   end
   in{i}=single(p);
end
in=cell2mat(in);
in=reshape(in,[N*M,1]);

有时matlab不能将parfor循环中的变量识别为“分片变量”,分片变量是一个变量,它在parfor循环之外有一个引用,并且它的每个元素只有一个worker访问(在parfor并行worker中)

因此,您可以使用临时变量并在parfor循环之后收集结果,

注意1:在老版本中向量化代码更好,因为循环过去并不像现在的R2017 (指this)中的循环那么好。

注2:如果"in“的大多数元素为零,请尝试使用”稀疏矩阵“,这可以节省大量内存;

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

https://stackoverflow.com/questions/50765120

复制
相关文章

相似问题

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