2012-07-01 34 views
5

我想找到矩陣的逆。如何使用加速框架執行矩陣逆運算?

我知道這涉及到第一個LU因式分解然後是反演步驟,但我無法通過搜索蘋果的10.7文檔來找到所需的功能!

這似乎是一個有用的帖子Symmetric Matrix Inversion in C using CBLAS/LAPACK,指出應該使用sgetrf_sgetri_函數。然而,搜索這些術語我在Xcode文檔中找不到任何東西。

有沒有人有這種矩陣操作的鍋爐代碼?

回答

13

Apple根本沒有記錄LAPACK代碼,我猜是因爲他們只是實現了netlib.org的標準接口。很遺憾,您無法從內置的Xcode文檔中搜索這些函數名稱,但解決方案非常簡單:只需在URL中指定函數名稱即可爲dgetrf_()去,http://www.netlib.org/clapack/what/double/dgetrf.c

要反轉矩陣,需要兩個LAPACK函數:執行LU分解的dgetrf_(),以及執行前一個函數的輸出並執行實際的反轉的dgetri_()

我創建了一個標準的應用程序項目使用Xcode中,增加了加速框架,創建兩個C文件:matinv.h,matinv.c和編輯main.m文件刪除可可的事情:

// 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; 
} 
+1

的規範LAPACK引用是使用LAPACK r的指南。 (http://www.netlib.org/lapack/lug/) –

+0

我在掃描這個神祕的(至少是說)LAPACK庫時遇到了麻煩。我怎樣才能使這個代碼適應單精度浮點數? –

+0

哦,我發現它:sgetrf_和sgetri_(S爲「單精度」?) –