Я новичок в интерфейсах LAPACK и C++/Fortran. Мне нужно решить линейные уравнения и задачи на собственные значения с помощью LAPACK/BLAS в Mac OS -X Lion. OS -X Lion предоставляет оптимизированные библиотеки BLAS и LAPACK (в /usr/lib ), и я связываю эти библиотеки вместо того, чтобы загружать их из netlib.
Моя программа (, воспроизведенная ниже ), компилируется и работает нормально, но дает неверные ответы. Я исследовал в Интернете и 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, и любая помощь будет оценена по достоинству.