2012-07-01 11 views
5

Ich möchte die Umkehrung einer Matrix finden.Wie wird die Matrix-Inverse-Operation mit dem Accelerate-Framework durchgeführt?

Ich weiß, dass dies erste LU-Faktorisierung dann der Inversionsschritt beinhaltet, aber ich kann die erforderliche Funktion nicht finden, indem ich Apples Dokumente von 10.7 suche!

Dies scheint wie ein nützlicher Beitrag Symmetric Matrix Inversion in C using CBLAS/LAPACK, wies darauf hin, dass die sgetrf_ und Funktionen verwendet werden sollten. Bei der Suche nach diesen Begriffen finde ich jedoch nichts in Xcode-Dokumenten.

Hat jemand einen Kesselblech-Code für diese Matrixoperation?

Antwort

13

Apple dokumentiert den LAPACK-Code überhaupt nicht, ich schätze, weil sie nur die Standardschnittstelle von netlib.org implementieren. Es ist eine Schande, dass Sie diese Funktionsnamen nicht aus den integrierten Xcode-Dokumenten suchen können, aber die Lösung ist ziemlich einfach: Geben Sie einfach den Funktionsnamen in der URL an, z. für dgetrf_() gehen Sie zu, http://www.netlib.org/clapack/what/double/dgetrf.c.

eine Matrix zwei LAPACK Funktion invertieren werden müssen: dgetrf_(), die LU-Faktorisierung durchführt, und dgetri_(), die den Ausgang der vorherigen Funktion übernimmt und führt die eigentliche Inversion.

habe ich ein Standard-Anwendungsprojekt mit Xcode, fügte der Rahmen beschleunigen, erstellen Sie zwei C-Dateien: matinv.h, matinv.c und bearbeitet die main.m Datei Cocoa Dinge zu entfernen:

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

Jetzt die Header-Datei,

// matinv.h 

int matrix_invert(int N, double *matrix); 

und dann die Quelldatei

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

die kanonische LAPACK Referenz ist die LAPACK Verwendung r's Guide. (http://www.netlib.org/lapack/lug/) –

+0

Ich habe Probleme beim Scannen dieser kryptischen Bibliothek (das ist zumindest) LAPACK. Wie kann ich diesen Code an Float mit einfacher Genauigkeit anpassen? –

+0

Oh, ich habe es gefunden: sgetrf_ und sgetri_ (S für "single precision"?) –