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