私はLAPACKとC++/Fortranインターフェースの初心者です。MacOS-XLionでLAPACK/BLASを使用して、線形方程式と固有値の問題を解決する必要があります。OS-X Lionは最適化されたBLASおよびLAPACKライブラリ(/ usr / lib内)を提供しており、netlibからダウンロードする代わりに、これらのライブラリをリンクしています。
私のプログラム(以下に再現)はコンパイルされて正常に実行されていますが、間違った答えが返ってきます。私はWebとStackoverflowで調査しましたが、この問題は、C ++とFortranが異なる形式(行メジャーと列メジャー)で配列を格納する方法に対処する必要があるかもしれません。ただし、私の例でわかるように、私の例の単純な配列は、C++とFortranで同じように見えるはずです。とにかくここに行きます。
次の線形システムを解きたいとしましょう。
x + y = 2
x-y = 0
解は(x、y)=(1,1)です。今、私は次のようにLapackを使用してこれを解決しようとしました
// 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);
}
このコードは次のようにコンパイルされました。
g++ -Wall -llapack -lblas lapacktest.cpp
ただし、これを実行すると、(-2,2)として解が得られますが、これは明らかに間違っています。行列の行/列の再配置のすべての組み合わせを試しa
ました。また、の行列表現a
は行と列の形式で同一である必要があります。この簡単な例を機能させることで、LAPACKを使い始めることができ、助けていただければ幸いです。