13

私の質問

  • この計算を高速化できる方法はありますか?
  • 同じ値を計算するために使用できるより良いアルゴリズムまたは実装はありますか?

アルゴリズムの説明

効率的な方法で解決するのに苦労している複雑なインデックス作成の問題があります。

目標は、同じサイズの行列、、およびw_primeの値の組み合わせを使用して行列を計算することです。wdYdX

の値はw_prime(i,j)として計算されますmean( w( indY & indX ) )。 ここで、indYindXは と のインデックスでdY、それぞれdXと に等しくiなりjます。

を計算するアルゴリズムの matlab での簡単な実装を次に示しますw_prime

for i = 1:size(w_prime,1)
  indY = dY == i;
  for j = 1:size(w_prime,2)
    indX = dX == j; 
    w_prime(ind) = mean( w( indY & indX ) );
  end
end

パフォーマンスの問題

以下の例では、この実装で十分です。ただし、私の実際の使用例wでは、dYdXは ~3000x3000であり、w_prime~60X900です。つまり、各インデックス計算は最大 900 万の要素で行われます。不必要に、この実装は遅すぎて使用できません。さらに、このコードを数十回実行する必要があります。

計算例

計算したい場合w(1,1)

  • その等しい 1のインデックスを見つけて、次のdYように保存します。indY
  • その等しい 1のインデックスを見つけて、次のdXように保存します。indX

ここに画像の説明を入力

  • の交点を見つけて名前を付けindYindX保存ind

ここに画像の説明を入力

  • mean( w(ind) ) に保存 w_prime(1,1)

ここに画像の説明を入力

一般的な問題の説明

2 つのベクトルXと で定義された設定値Tがあります。どちらも 1XN で、N は ~3000 です。さらに、X と T の値は、それぞれ (1 60) と (1 900) の間隔で区切られた整数です。

行列dXdTは単なる距離行列であり、点間のペアごとの距離が含まれていることを意味します。すなわちdx(i,j)等しいabs( x(i) - x(j) )

それらは以下を使用して計算されます。dx = pdist(x);

マトリックスwは、あるポイントが別のポイントに与える影響を表す重みマトリックスと考えることができます。

計算の目的は、ディメンション内とディメンション内でw_prime(a,b)によって区切られたポイントのサブセット間の平均重みを決定することです。aXbT

これは次のように表現できます。

ここに画像の説明を入力

4

1 に答える 1

6

これはACCUMARRAYで簡単です:

nx = max(dX(:));
ny = max(dY(:));

w_prime = accumarray([dX(:),dY(:)],w(:),[nx,ny],@mean,NaN)

出力は、対応するインデックスのペアがない場合は常に、NaNを含むサイズごとの配列になりますnxny常に完全なインデックスが存在することが確実な場合は、上記の計算を次のように簡略化できます。

w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)

では、accumarrayは何をするのでしょうか?の行を調べます[dX(:),dY(:)]。各行は、その行が寄与する(i,j)座標ペアを示します。w_primeすべてのペアについて(1,1)、関数(@mean)をの対応するエントリに適用しw(:)、出力をに書き込みますw_prime(1,1)

于 2012-09-12T16:37:01.967 に答える