2012-07-01 27 views
5

Me gustaría encontrar el inverso de una matriz.¿Cómo se realiza la operación inversa de la matriz usando el marco de aceleración?

Sé que esto implica la primera factorización de LU luego el paso de inversión pero no puedo encontrar la función requerida buscando los documentos de Apple de 10.7.

Esto parece una publicación útil Symmetric Matrix Inversion in C using CBLAS/LAPACK, indicando que se deben usar las funciones sgetrf_ y sgetri_. Sin embargo, al buscar estos términos no encuentro nada en los documentos de Xcode.

¿Alguien tiene código de placa de caldera para esta operación matricial?

Respuesta

13

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

la referencia LAPACK canónica es el uso LAPACK Guía de r. (http://www.netlib.org/lapack/lug/) –

+0

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? –

+0

Oh, lo encontré: sgetrf_ y sgetri_ (S para "precisión simple"?) –

Cuestiones relacionadas