Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何纠正;'的有效索引;变量';在PARFOR循环中受限制;matlab中的误差_Matlab_Parfor - Fatal编程技术网

如何纠正;'的有效索引;变量';在PARFOR循环中受限制;matlab中的误差

如何纠正;'的有效索引;变量';在PARFOR循环中受限制;matlab中的误差,matlab,parfor,Matlab,Parfor,我试图在MatlabR2016a中设置一个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 N=尺寸(A,1); M=尺寸(v,1

我试图在MatlabR2016a中设置一个
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
N=尺寸(A,1);
M=尺寸(v,1);
in=零(N*M,1);
parfori=1:N
对于j=1:M
k=(i-1)*M+j;
如果sqrt(和((A(i,:)-v(j,:).^2))
N=size(A,1);
M=尺寸(v,1);
in=单元(N,1);
parfori=1:N
s=v;
p=零(1:M,1);
对于j=1:M
k=(i-1)*M+j;

如果sqrt(sum((A(i,:)-s(j,:).^2))则问题在于,MATLAB无法识别变量
k
正在将矩阵
正确切片。解决方案应该是分别使用
i
j
中索引

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
N=尺寸(A,1);
M=尺寸(v,1);
in=零(M,N);
parfori=1:N
对于j=1:M

如果sqrt(sum((A(i,:)-v(j,:).^2))注意,您正在对矩阵的列进行大量的范数计算,如果您的matlab是2017b,并且matlab的版本是R2016a,您可以使用
vecnorm
立即进行这些计算。如问题的第一行所述。这里的错误来自于这样一个事实,即您在
中并行化了
,但并行任务正在尝试写入相同的代码thing@percusse你能在下面的回答中详细说明吗@SardarUsama No对于
i
的多次迭代,
k
的值永远不会具有相同的值,因为它也取决于
j
k
从1:M*N开始计数。这是原始问题中的一个输入错误,它是
k=(i-1)*M+j
这可能是我在使用的PC上研究过的问题,但我遇到了内存不足错误。否则,它似乎正在工作。有没有办法把索引
保存在
中,作为多个变量,然后在
parfor
循环之外重新组合它们,或者尝试其他方法来消除这个内存问题?有没有可能在解决方案中使用类似的方法?@YixiShan,我根据你的评论更新了答案,它消耗的内存比以前的代码少得多,(代码可以在8G内存上运行,没有问题)谢谢你,不幸的是,在我的机器上,只有4GB的内存可用。我认为最好的解决方案是修改您的答案,使其仅以1:N或类似的四分之一间隔,然后在最后将数组组合在一起。我还知道将存储许多重复的值,我计划在
parfor
末尾使用
unique
删除这些值。是否可以更快地实现这一点,以缩短
的大小?如果没有,那么以四分之一或更小的间隔运行
parfor
可能会修复它。@YixiShan“in”有40000*8000=32e7个元素,每个元素有4个字节,因此“in”大小为1.1921 GB,对于某些操作,您需要额外的可用内存(约为in的大小),因此您可以执行一些parfor,将数据保存到hdd,清除变量并继续parfor等;你回答的第一种方法非常有效,谢谢。如果时间允许的话,我可以稍后再试试第二个紧跟在另一个答案中的
parfor
之后。我不知道这是否必要,但MatLab给出了警告。
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(:);