5

逆行列を見つけたいのですが。

私はこれが最初のLU分解、次に反転ステップを含むことを知っていますが、10.7のアップルのドキュメントを検索しても必要な関数を見つけることができません!

これは、 CBLAS / LAPACKを使用したCでの対称行列反転後の有用なようであり、sgetrf_およびsgetri_関数を使用する必要があることを示しています。ただし、これらの用語を検索しても、Xcodeドキュメントには何も見つかりません。

この行列演算のボイラープレートコードを持っている人はいますか?

4

1 に答える 1

15

AppleはLAPACKコードをまったく文書化していません。これは、LAPACKコードがnetlib.orgの標準インターフェイスを実装しているだけだからだと思います。組み込みのXcodeドキュメントからこれらの関数名を検索できないのは残念ですが、解決策はかなり簡単です。たとえばdgetrf_()http://www.netlib.org/にアクセスする場合は、URLで関数名を指定するだけです。 clapack / what / double/dgetrf.c

行列を反転するには、2つのLAPACK関数が必要ですdgetrf_()。これはLU分解を実行dgetri_()し、前の関数の出力を取得して実際の反転を実行します。

Xcodeを使用して標準のアプリケーションプロジェクトを作成し、Accelerate Frameworkを追加し、matinv.h、matinv.cの2つのCファイルを作成し、main.mファイルを編集してCocoaのものを削除しました。

// main.m

#import "matinv.h"

int main(int argc, char *argv[])
{
    int N = 3;
    double A[N*N];
    A[0] = 1; A[1] = 1; A[2] = 7;
    A[3] = 1; A[4] = 2; A[5] = 1;
    A[6] = 1; A[7] = 1; A[8] = 3;
    matrix_invert(N, A);
    //        [ -1.25  -1.0  3.25 ]
    // A^-1 = [  0.5       1.0  -1.5  ]
    //        [  0.25   0.0 -0.25 ] 
    return 0;
}

ヘッダーファイル、

//  matinv.h

int matrix_invert(int N, double *matrix);

次にソースファイル、

int matrix_invert(int N, double *matrix) {

    int error=0;
    int *pivot = malloc(N*sizeof(int)); // LAPACK requires MIN(M,N), here M==N, so N will do fine.
    double *workspace = malloc(N*sizeof(double));

    /*  LU factorisation */
    dgetrf_(&N, &N, matrix, &N, pivot, &error);

    if (error != 0) {
        NSLog(@"Error 1");
        free(pivot);
        free(workspace);
        return error;
    }

    /*  matrix inversion */
    dgetri_(&N, matrix, &N, pivot, workspace, &N, &error);

    if (error != 0) {
        NSLog(@"Error 2");
        free(pivot);
        free(workspace);
        return error;
    }

    free(pivot);
    free(workspace);
    return error;
}
于 2012-07-04T01:56:34.413 に答える