2012-07-01 30 views
5

Chciałbym znaleźć odwrotność macierzy.Jak wykonać operację odwrotną macierzy za pomocą ramy przyspieszania?

Wiem, że wiąże się to z pierwszą czynnością LU, a następnie z krokiem inwersji, ale nie mogę znaleźć wymaganej funkcji, przeszukując dokumenty Apple'a na 10.7!

To wydaje się przydatny wpis Symmetric Matrix Inversion in C using CBLAS/LAPACK, wskazując, że należy używać funkcji sgetrf_ i sgetri_. Jednak podczas wyszukiwania tych haseł nie znajduję niczego w dokumentach Xcode.

Czy ktoś ma kod płyty kotła dla tej operacji matrycy?

Odpowiedz

13

Apple nie dokumentuje w ogóle kodu LAPACK, ponieważ domyślnie implementuje standardowy interfejs z netlib.org. Szkoda, że ​​nie można wyszukiwać nazw tych funkcji z wbudowanych dokumentów Xcode, jednak rozwiązanie jest dość proste: wystarczy podać nazwę funkcji w adresie URL, np. dla dgetrf_() przejdź do, http://www.netlib.org/clapack/what/double/dgetrf.c.

Aby odwrócić matrycę, potrzebne są dwie funkcje LAPACK: dgetrf_(), która wykonuje rozkład wartości LU, oraz dgetri_(), która pobiera dane wyjściowe poprzedniej funkcji i dokonuje rzeczywistej inwersji.

stworzyłem standardowego przy użyciu aplikacji projektu Xcode, dodał Przyspieszenie Framework, należy utworzyć dwa pliki C: matinv.h, matinv.c i edytować plik main.m do usuwania kakao rzeczy:

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

teraz plik nagłówka,

// matinv.h 

int matrix_invert(int N, double *matrix); 

a następnie plik źródłowy,

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

kanoniczna odniesienia LAPACK jest użycie LAPACK r's Guide. (http://www.netlib.org/lapack/lug/) –

+0

Mam problem ze skanowaniem tej tajemniczej biblioteki (co najmniej), która jest LAPACK. Jak mogę dostosować ten kod do pojedynczej precyzji zmiennoprzecinkowej? –

+0

Och, znalazłem: sgetrf_ i sgetri_ (S dla "pojedynczej precyzji"?) –