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;
}
die kanonische LAPACK Referenz ist die LAPACK Verwendung r's Guide. (http://www.netlib.org/lapack/lug/) –
Ich habe Probleme beim Scannen dieser kryptischen Bibliothek (das ist zumindest) LAPACK. Wie kann ich diesen Code an Float mit einfacher Genauigkeit anpassen? –
Oh, ich habe es gefunden: sgetrf_ und sgetri_ (S für "single precision"?) –