Tôi là người mới bắt đầu với LAPACK và C++/Fortran giao tiếp. Tôi cần phải giải các phương trình tuyến tính và các vấn đề riêng biệt bằng cách sử dụng LAPACK/BLAS trên Mac OS-X Lion. OS-X Lion cung cấp các thư viện BLAS và LAPACK được tối ưu hóa (trong/usr/lib) và tôi liên kết các thư viện này thay vì tải chúng xuống từ netlib.Hiểu các cuộc gọi LAPACK trong C++ với một ví dụ đơn giản
Chương trình của tôi (được sao chép bên dưới) đang biên soạn và chạy tốt, nhưng nó cho tôi câu trả lời sai. Tôi đã nghiên cứu trong web và Stackoverflow và vấn đề có thể phải đối phó với cách mảng C++ và Fortran trong các định dạng khác nhau (hàng chính so với cột chính). Tuy nhiên, như bạn sẽ thấy trong ví dụ của tôi, mảng đơn giản cho ví dụ của tôi sẽ trông giống hệt trong C++ và fortran. Dù sao đi nữa.
phép nói rằng chúng ta muốn giải quyết các hệ thống tuyến tính sau:
x + y = 2
x - y = 0
Giải pháp là (x, y) = (1,1). Bây giờ tôi đã cố gắng để giải quyết việc này bằng LAPACK như sau
// 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);
}
Mã này đã được biên soạn như sau:
g++ -Wall -llapack -lblas lapacktest.cpp
: Khi chạy phần này, tuy nhiên, tôi nhận được các giải pháp như (-2,2) rõ ràng là sai. Tôi đã thử tất cả kết hợp sắp xếp lại hàng/cột của ma trận a
. Đồng thời quan sát biểu diễn ma trận của a
phải giống hệt nhau ở định dạng hàng và cột. Tôi nghĩ rằng việc làm ví dụ đơn giản này sẽ giúp tôi bắt đầu với LAPACK và mọi trợ giúp sẽ được đánh giá cao.
bạn đang sử dụng thư viện lapack nào và mã 64 bit? – Anycorn
Tôi đang sử dụng /usr/lib/liblapack.dylib và /usr/lib/libblas.dylib có sẵn trên Mac OS-X Lion. Tôi chưa cài đặt bất kỳ thư viện LAPACK/BLAS bên ngoài nào. – RDK
Trong ví dụ này, bạn đang giải quyết một ma trận đối xứng để cho dù bạn có hàng chính hay cột chính, bạn sẽ không thấy bất kỳ sự khác biệt nào. – SirGuy