Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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
Matlab 使用parfor并行化嵌套循环以计算对称距离矩阵_Matlab_Parallel Processing_Parfor - Fatal编程技术网

Matlab 使用parfor并行化嵌套循环以计算对称距离矩阵

Matlab 使用parfor并行化嵌套循环以计算对称距离矩阵,matlab,parallel-processing,parfor,Matlab,Parallel Processing,Parfor,我试图计算两个struct对象之间的成对距离。这个距离是对称的。我有大约N=8000,这样的对象在一个数组中 所以我只需要计算N*(N+1)/2距离。既然每个计算都是独立的,我如何并行化这个计算呢 这里,我的对象存储在数组X中,我想将距离存储在数组A中,数组A的大小为N*(N+1)/2。BDHMM()是一个返回两个对象之间距离的函数 我已经尝试了以下Matlab代码 N = 8000; load inithmm.mat size = N*(N+1)/2; A = zeros(size,1);

我试图计算两个struct对象之间的成对距离。这个距离是对称的。我有大约N=8000,这样的对象在一个数组中

所以我只需要计算N*(N+1)/2距离。既然每个计算都是独立的,我如何并行化这个计算呢

这里,我的对象存储在数组X中,我想将距离存储在数组A中,数组A的大小为N*(N+1)/2。BDHMM()是一个返回两个对象之间距离的函数

我已经尝试了以下Matlab代码

N = 8000;
load inithmm.mat
size = N*(N+1)/2;
A = zeros(size,1);

matlabpool open local 4
  parfor i = 1:N-1
    i
    T = [];
    for j = i:N
      if(j == i)
          temp = 0;
      else
          temp = BDHMM(X(i),X(j));
      end
      T = [T; temp];
    end

    beg = size - (N + 1 - i)*(N + 2 - i)/2 + 1;
    l = length(T);
    A(beg:beg+l-1, 1) = T;
  end
matlabpool close
我得到以下错误:

Error: The variable A in a parfor cannot be classified.

请提供帮助。

您不能刺杀使用parfor计算的索引,Matlab需要提前知道矩阵的哪些部分将通过witch迭代刺杀。如果你仔细想想,这是有道理的

这应该解决这个问题:

N = 800;
size = N*(N+1)/2;
A = cell(N,1);
matlabpool open local 4
  parfor i = 1:N-1
    i
    T = zeros(N-i+1,1);
    for j = i:N
      if(j == i)
          T(j-i+1) = 0;
      else
          T(j-i+1) = BDHMM(X(i),X(j));
      end
    end

    A{i, 1} = T;
  end

matlabpool close
B=vertcat(A{:})

您不能刺杀使用parfor计算的索引,Matlab需要提前知道矩阵的哪些部分将通过witch迭代刺杀。如果你仔细想想,这是有道理的

这应该解决这个问题:

N = 800;
size = N*(N+1)/2;
A = cell(N,1);
matlabpool open local 4
  parfor i = 1:N-1
    i
    T = zeros(N-i+1,1);
    for j = i:N
      if(j == i)
          T(j-i+1) = 0;
      else
          T(j-i+1) = BDHMM(X(i),X(j));
      end
    end

    A{i, 1} = T;
  end

matlabpool close
B=vertcat(A{:})

您可能想阅读文档中关于变量分类的部分,特别是关于切片变量的部分:这可能是因为变量
beg
的计算发生在这个循环中,因此,您可能会在不同的循环中出现重叠范围,造成了一个坏问题。另请参阅,您可能想阅读文档中关于变量分类的部分,特别是关于切片变量的部分:发生这种情况可能是因为变量
beg
的计算发生在这个循环中,因此,在不同的循环中,可能会出现重叠的范围,从而导致一个不好的问题。另请参阅