2 つの行列 A と B が与えられ、B が対称 (および正の半定値) である場合、A`*B*A を計算する最良の (最速の) 方法は何ですか?
現在、BLAS を使用して、最初に dsymm を使用して C=B*A を計算し (一時行列 C を導入)、次に dgemm を使用して A`*C を計算します。
BLAS と mkl を使用してこれを行うためのより良い (より高速で、一時的ではない) 方法はありますか?
ありがとう。
2 つの行列 A と B が与えられ、B が対称 (および正の半定値) である場合、A`*B*A を計算する最良の (最速の) 方法は何ですか?
現在、BLAS を使用して、最初に dsymm を使用して C=B*A を計算し (一時行列 C を導入)、次に dgemm を使用して A`*C を計算します。
BLAS と mkl を使用してこれを行うためのより良い (より高速で、一時的ではない) 方法はありますか?
ありがとう。
ある種の答えを提供します。一般的なケースA*B * Cと比較すると、最終結果は対称行列であることがわかります。BLASサブルーチンdsymmを使用してC=B * Aを計算した後、A'Cを計算しますが、必要なのは行列の上部対角部分を計算し、厳密に上部対角部分を下部対角部分にコピーすることだけです。
残念ながら、2つの一般的な行列が与えられると、出力行列が対称になると事前に主張できるBLASルーチンはないようです。このために独自の関数を作成することが有益かどうかはわかりません。これはおそらく、行列のサイズと実装によって異なります。
編集:このアイデアは最近ここで扱われているようです:結果行列の上部または下部三角部分のみを更新する行列乗算ルーチン