【问题标题】:Using parfor to parallelize a nested loop for computation of a symmetric distance matrix使用 parfor 并行化嵌套循环以计算对称距离矩阵
【发布时间】:2013-09-16 20:45:01
【问题描述】:

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

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

这里我的对象存储在数组 X 中,我想将距离存储在大小为 N*(N+1)/2 的数组 A 中。 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.

请帮忙。

【问题讨论】:

标签: matlab parallel-processing parfor


【解决方案1】:

你不能刺杀你用 parfor 计算的索引,Matlab 需要提前知道矩阵的哪些部分将被女巫迭代刺杀。如果您考虑一下,这是有道理的。

这应该解决它:

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{:})

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 2018-05-28
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2018-08-05
    相关资源
    最近更新 更多