C# で 3x3 回転と 4x4 変換行列を行う最も効率的な方法matrix * matrix
と操作を探しています。matrix * vector
現在、行列を多次元配列 ( new double[3,3]
、new double[4,4]
) に格納しています。それを変更することに完全に反対しているわけではありませんが、可能であれば構文を維持したいと考えています。ネストされた 3 つの標準 for ループを使用した現在の乗算は正常に機能しますが、ボトルネックになる可能性があります。
これまでの私の考え:
- Strassen のような最適化されたアルゴリズムは、これらのサイズでは実用的ではありません
- 単一の 4x4 乗算のレベルでも、並列化はあまり意味がありません。より高いレベルで行われたほうがよい。
- 境界チェックの効率が悪いため、c# では多次元配列が遅くなりました (だったでしょうか?) が、これは安全でないポインター演算で克服できます。(この情報がどの程度最新のものかはわかりません)
- 回転行列は対称的ですが、それを悪用する方法はありますか?
- おそらく最大の利点は、キャッシュの局所性を使用して、メモリ内で互いに近い値が一緒にアクセスされるようにすることで達成できます。しかし、これを行う方法がわかりません。
安全でない、固定された、3 つの for ループを使用して独自のソリューションをハックする前に、この標準的な問題に対してテスト済みで最適化されたソリューションが既に存在しますか?
または、私が見落としている他の最適化はありますか?