行列演算と複雑な数学を含む計算を C で実行しようとしています。Matlab に精通しており、これらのタイプの計算を簡単かつ効率的に実行できることを知っています。たとえば、同じサイズの 2 つの行列 A と B は、それぞれが複素数値の要素を持ち、式 A+B によって簡単に合計できます。CまたはObjective Cでこれらのタイプの式をプログラミングするために推奨できるパッケージまたは手法はありますか? 複素数の操作を実行できる complex.h は知っていますが、複雑な行列の操作を実行する方法を認識していません。これが私が本当に求めているものです。同様に、行列の操作を可能にするパッケージを知っていますが、それらが複雑な行列の操作に役立つとは思いません。
2 に答える
2 つの行列の加算や乗算などの基本的な線形代数演算に はBLASを使用し、因数分解行列などのより計算集約的なアルゴリズムには LAPACK を使用します。
BLAS ルーチンには、アルファベットのスープのような面白い名前が付いています。これは、関数名の長さに関する Fortran の古い制限によるものです。名前の最初の文字は、BLAS ルーチンが操作するデータ型を示します。複素数に興味があるので、c
(複素単精度の場合) またはz
(zouble 複素倍精度の場合) で始まるルーチンを調べたいと思います。たとえば、複雑な行列を乗算する BLAS ルーチンA
とB
is CGEMM
or ZGEMM
(ここでGEMM
は、一般的な行列行列乗算を表します)。
Objective C では、BLAS はAccelerateフレームワークを通じて利用できるようです。命名規則はcblas_
、元の BLAS 名の先頭に追加することです。たとえば、ここに のドキュメントがありますcblas_zgemm
。
通常、ベンダーは自社のプラットフォームに最適化されたバージョンの BLAS を提供しています。これらのルーチンは、これらの行列演算の単純な実装よりも大幅に高速になることがよくあります。多くの場合、これらのルーチンを使用して、マシンの最大浮動小数点パフォーマンスを達成するか、ほぼ達成することができます。実際、LINPACK ベンチマーク (LINPACK は LAPACK の前身) は、これらのルーチンを使用して、スーパーコンピューターのベンチマークとランク付けを行います。
BLASまたはLAPACKを探しています。これらは、ダウンロードしてインストールできる線形代数ライブラリです。