2010-11-30 39 views
4

Est-ce que quelqu'un sait quelle fonction/méthode utiliser dans Accelerate (CLAPACK) pour résoudre une matrice augmentée comme celle ci-dessous? Vous cherchez un exemple de code, des liens vers des exemples, des conseils sur la façon de résoudre la matrice. J'ai parcouru la documentation, mais la plupart des choses ont trait à des systèmes graphiques plus complexes et il existe des centaines de méthodes apparemment similaires.Utiliser Accelerate (CLAPACK) pour résoudre une matrice augmentée?

____   ____ 
|     | 
| 4 3 -1 | 2 | 
| -2 3 8 | 0 | 
| 0 2 6 | -1 | 
|____   ____| 

Répondre

10
#include <Accelerate/Accelerate.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) { 

    /* Dimension of the matrix */ 
    __CLPK_integer n = 3; 

    /* Number of right-hand side vectors to solve for */ 
    __CLPK_integer nrhs = 1; 

    /* Note the ordering of the entries in A. LAPACK uses "column major" 
     ordering as follows: 

     0 3 6 
     1 4 7 
     2 5 8 

     This is a Fortran-ism that persists in CLAPACK.     */ 
    double A[9] = {4.0, -2.0, 0.0, 3.0, 3.0, 2.0, -1.0, 8.0, 6.0 }; 

    /* "Leading dimension" of the matrix; most of the time, this is just the 
     matrix dimension (but not always; you'll learn about this by the time 
     you need to use it. */ 
    __CLPK_integer lda = 3; 

    /* Integer array to hold information about the matrix factorization */ 
    __CLPK_integer ipiv[3]; 

    /* Right hand side to solve for */ 
    double x[3] = { 2.0, 0.0, -1.0 }; 

    /* Leading dimension of the right hand side vector */ 
    __CLPK_integer ldb = 3; 

    /* Status variable */ 
    __CLPK_integer info; 

    /* Solve the augmented system with a call to dgesv_. Note that this 
     routine will overwrite the contents of the array A with a factored 
     form of the matrix. If you need the original matrix, you need to 
     copy it before calling dgesv_. Note that all the scalar arguments 
     are passed as pointers; this too is a Fortran-ism.     */ 
    dgesv_(&n, &nrhs, A, &lda, ipiv, x, &ldb, &info); 

    /* Handle error conditions */ 
    if (info) 
     printf("Could not solve system; dgesv exited with error %d\n", info); 

    /* If no error, print the result */ 
    else 
     printf("Solution is [%f, %f, %f]\n", x[0], x[1], x[2]); 

    return 0; 
} 

compilez et exécutez:

scanon$ gcc solve.c -framework Accelerate 
scanon$ ./a.out 
Solution is [-0.479167, 1.125000, -0.541667] 
+0

obtenu ce travail ... Aussi pour quelqu'un d'autre qui vient à travers cela, vous devrez peut-être utiliser long int au lieu d'int. Merci encore – John

+0

@John: Strictement parlant, vous devez utiliser le type '__CLPK_integer' défini dans l'en-tête. Je vais modifier ma réponse pour refléter cela. –