Apple no documenta en absoluto el código LAPACK, supongo que porque simplemente implementan la interfaz estándar de netlib.org. Es una pena que no se puedan buscar los nombres de estas funciones a partir de los documentos de Xcode integrados, sin embargo, la solución es bastante sencilla: simplemente especifique el nombre de la función en la URL, p. para dgetrf_()
vaya a, http://www.netlib.org/clapack/what/double/dgetrf.c.
Para invertir una matriz se necesitan dos funciones LAPACK: dgetrf_()
, que realiza la factorización LU, y dgetri_()
que toma la salida de la función anterior y realiza la inversión real.
he creado un estándar de proyecto de aplicación usando Xcode, añade el marco Accelerate, cree dos archivos de C: matinv.h, matinv.c y editado el archivo main.m para eliminar cosas cacao:
// 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;
}
Ahora el archivo de cabecera,
// matinv.h
int matrix_invert(int N, double *matrix);
y luego el archivo de origen,
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;
}
la referencia LAPACK canónica es el uso LAPACK Guía de r. (http://www.netlib.org/lapack/lug/) –
Tengo problemas para escanear esta biblioteca críptica (por decir lo menos) que es LAPACK. ¿Cómo puedo adaptar este código al flotador de precisión simple? –
Oh, lo encontré: sgetrf_ y sgetri_ (S para "precisión simple"?) –