1

2 つの構造体オブジェクト間のペアごとの距離を計算しようとしています。この距離は対称です。配列には約 N = 8000 のオブジェクトがあります。

したがって、N * (N+1)/2 の距離のみを計算する必要があります。各計算は独立しているため、この計算をどのように並列化できますか?

ここで、オブジェクトは配列 X に格納されており、サイズ N*(N+1)/2 の配列 A に距離を格納したいと考えています。BDHMM() は、2 つのオブジェクト間の距離を返す関数です。

次の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.

助けてください。

4

1 に答える 1

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{:})
于 2013-09-12T15:11:20.060 に答える