0

精度行列 sigmaT を共分散行列に変換しようとしています。私は2つのアプローチを試しました:

covMat = zeros(size(sigmaT));
for i=1:t
    covMat(:, :, i) = eye(D)/sigmaT(:,:,i);
end

covMat = bsxfun(@rdivide, eye(D), sigmaT);

sigmaT の一部の要素はゼロであるため、ゼロによる除算が発生します。最初のループベースのソリューションでは、0 による除算が発生する要素を 0 として保持し、2 番目のアプローチでは要素を NaN に設定します。

私の質問は次のとおりです:なぜそれらは異なる動作をするのですか?2番目の1行のアプローチを変更してループベースのアプローチとして動作させるにはどうすればよいですか? 後者のソリューションは、大規模な行列では大幅に高速になるはずです。

4

1 に答える 1

0

ループベースのアプローチは行列除算を実行しています。つまり、各反復の結果は の逆行列ですsigmaT(:,:,i)./( の代わりに) 演算子を使用して、要素ごとの計算を実行するようにループを調整できます/

あなたのbsxfunベースのアプローチは、要素ごとの分割を実行しています。つまり、個々の要素が反転しています。bsxfun3D 配列に含まれる各 2D 行列に対して行列演算を実行するためにを使用する方法はありません。

これらの答えは大きく異なります。問題に適したアプローチを使用する必要があります。この 2 つのパフォーマンスの違いは、おそらく比較的小さいものです。

于 2013-03-20T14:11:14.287 に答える