行列とベクトルの乗算を必要とするアルゴリズムを C で作成しています。ベクトルJ (1 x W)の転置をそれ自体で乗算し、スカラーaを使用してスケーリングされた単位行列Iを追加することによって作成される行列Q (W x W) があります。
Q = [(J^T) * J + aI]。
次に、 Q の逆数にベクトルGを掛けて、ベクトルMを取得する必要があります。
M = (Q^(-1)) * G.
私はcblasとclapackを使用してアルゴリズムを開発しています。行列Qが乱数 (タイプ float) を使用して設定され、ルーチンsgetrf_およびsgetri_を使用して反転される場合、計算された逆行列は正しいです。
しかし、行列 Q が対称の場合、つまり (J^T) x J を掛けた場合、計算された逆数は間違っています!! .
C からlapackルーチンを呼び出す際に、配列の行優先 (C の場合) および列優先 (FORTRAN の場合) の形式を認識していますが、対称行列の場合、これは A^T = A であるため問題になりません。
行列反転の C 関数コードを以下に添付しました。
これを解決するためのより良い方法があると確信しています。誰でもこれで私を助けることができますか?
cblas を使用したソリューションは素晴らしいでしょう...
ありがとう。
void InverseMatrix_R(float *Matrix, int W)
{
int LDA = W;
int IPIV[W];
int ERR_INFO;
int LWORK = W * W;
float Workspace[LWORK];
// - Compute the LU factorization of a M by N matrix A
sgetrf_(&W, &W, Matrix, &LDA, IPIV, &ERR_INFO);
// - Generate inverse of the matrix given its LU decompsotion
sgetri_(&W, Matrix, &LDA, IPIV, Workspace, &LWORK, &ERR_INFO);
// - Display the Inverted matrix
PrintMatrix(Matrix, W, W);
}
void PrintMatrix(float* Matrix, int row, int colm)
{
int i,k;
for (i =0; i < row; i++)
{
for (k = 0; k < colm; k++)
{
printf("%g, ",Matrix[i*colm + k]);
}
printf("\n");
}
}