我正在尝试在MatLab R2016a中设置一个parfor
嵌套循环,如下所示。
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循环中受到限制。有没有办法纠正这个问题,因为数组A
和v
都相当大,A
超过40,000行,v
超过8,000行?变量tol
为0.0959。
发布于 2018-06-12 01:27:38
问题是MATLAB没有识别出变量k
对矩阵in
进行了正确的切片。解决方案应该是分别使用i
和j
对in
进行索引:
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
另一种选择,但它需要更多的中间内存,是计算这个根本没有循环:
A = reshape(A,1,N,[]);
v = reshape(v,M,1,[]);
in = sum(bsxfun(@minus,A,v).^2,3) < tol*tol;
in = in(:);
(或者类似的东西,我还没有运行这段代码...如果有打字错误或其他错误,请让我知道,或修复帖子。)
发布于 2018-06-11 06:05:37
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“的大多数元素为零,请尝试使用”稀疏矩阵“,这可以节省大量内存;
https://stackoverflow.com/questions/50765120
复制相似问题