トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

MM行列の逆行列を計算_clapack

MM行列の逆行列を計算

行と列の要素数が同じ(ここではM個とする)場合に限り、CLAPACKの「dgetrf_」と「dgetri_」の2つを使うことで逆行列の計算が可能です。

行と列の要素数が異なる場合は、擬似逆行列?を使うようにします。

なお、CLAPACKのヘッダファイルである「f2c.h」「clapack.h」を忘れずにインクルードするようにしてください。また、インクルードの指定順は「f2c.h」「clapack.h」の順に指定しないとエラーになります。

#include "f2c.h"
#include "clapack.h" 

/**
 *  M x M 行列の逆行列を計算する
 *  @param[in]  pM     対象のM x N行列(列行の順である点に注意) 
 *  @param[in]  mCou   行列Mの行数
 *  @param[in]  nCou   行列Mの列数
 *  @param[out] pRetM  計算後の行列要素が返る配列(列行の順である点に注意)
 *  @return 処理に成功すればtrueが返る
 */
bool MatrixInverse(double *pM, const int mCou, const int nCou, double *pRetM)
{
   integer m, n, lda, info;
   integer piv[500];
   integer lwork;
   double *pMat;
   double work[500];

   if(mCou != nCou) return false;

   m     = mCou;
   n     = nCou;
   lda   = m;
   lwork = 500;

   pMat = (double *)alloca(sizeof(double) * mCou * nCou);

   // 行列要素を作業バッファにコピー
   memcpy(pMat, pM, sizeof(double) * mCou * nCou);

   // 逆行列の計算
   dgetrf_(&m, &n, pMat, &lda, piv, &info);
   if(info != 0) return false;
   dgetri_(&n, pMat, &lda, piv, work, &lwork, &info);
   if(info != 0) return false;

   // 行列をpRetMにコピー
   memcpy(pRetM, pMat, sizeof(double) * mCou * nCou);

   return true;
}

途中で作業用の領域piv、work とそのサイズlworkが出てきますが、適当にmCou * nCouより十分大きな値を入れてます。計算途中で容赦なく変数の値を書き換えるようですので、一度pMatというローカルメモリを確保してそこに計算データを格納するようにしています。

結果のpRetMatには列 x 行でデータが格納されます(行数と列数は同じ)。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.