Comprendre les appels LAPACK en C ++ avec un exemple simple

Je suis un débutant avec LAPACK et C++/Fortran interfaçage. J'ai besoin pour résoudre des équations linéaires et les valeurs propres problèmes à l'aide de LAPACK/BLAS sur Mac OS X Lion. OS X Lion fournit optimisé BLAS et LAPACK (bibliothèques dans /usr/lib) et je suis reliant ces bibliothèques au lieu de les télécharger à partir de netlib.

Mon programme (reproduit ci-dessous) est la compilation et l'exécution de l'amende, mais il me donne de mauvaises réponses. J'ai fait des recherches sur le web et de Stackoverflow et le problème peut avoir à traiter que du C++ et Fortran stocker des tableaux dans différents formats (ligne principale vs Colonne principale). Cependant, comme vous le verrez dans mon exemple, le tableau simple pour mon exemple, devraient être identiques, en C++ et fortran. De toute façon, ici, va.

Disons que nous voulons résoudre le système linéaire suivant:

x + y = 2

x - y = 0

La solution est (x,y) = (1,1). Maintenant, j'ai essayé de résoudre ce à l'aide de Lapack comme suit

//LAPACK test code

#include<iostream>
#include<vector>

using namespace std;
extern "C" void dgetrs(char *TRANS, int *N, int *NRHS, double *A, 
                      int *LDA, int *IPIV, double *B, int *LDB, int *INFO );

int main()
{
    char trans = 'N';
    int dim = 2;    
    int nrhs = 1;
    int LDA = dim;
    int LDB = dim;
    int info;

    vector<double> a, b;

    a.push_back(1);
    a.push_back(1);
    a.push_back(1);
    a.push_back(-1);

    b.push_back(2);
    b.push_back(0);

    int ipiv[3];


    dgetrs(&trans, &dim, &nrhs, & *a.begin(), &LDA, ipiv, & *b.begin(), &LDB, &info);


    std::cout << "solution is:";    
    std::cout << "[" << b[0] << ", " << b[1] << ", " << "]" << std::endl;
    std::cout << "Info = " << info << std::endl; 

    return(0);
}

Ce code a été réalisé de la façon suivante:

g++ -Wall -llapack -lblas lapacktest.cpp

Sur l'exécution de cette, cependant, je reçois la solution (-2,2), qui est évidemment faux. J'ai essayé toute combinaison de ligne/colonne ré-arrangement de ma matrice a. Observez également la représentation matricielle de a doit être identique dans la rangée et de la colonne formats. Je pense que l'obtention de ce simple exemple de travail permettra de me commencé avec LAPACK et toute aide sera appréciée.

source d'informationauteur RDK