Apple không ghi lại mã LAPACK chút nào, tôi đoán vì họ chỉ triển khai giao diện chuẩn từ netlib.org. Thật đáng tiếc là bạn không thể tìm kiếm các tên hàm này từ các tài liệu Xcode được tích hợp sẵn, tuy nhiên giải pháp khá thẳng về phía trước: chỉ cần chỉ định tên hàm trong URL, ví dụ: cho số dgetrf_()
truy cập, http://www.netlib.org/clapack/what/double/dgetrf.c.
Để đảo ngược ma trận, hai hàm LAPACK cần: dgetrf_()
, thực hiện LU factorisation và dgetri_()
sẽ lấy đầu ra của hàm trước và thực hiện đảo ngược thực tế.
Tôi tạo ra một tiêu chuẩn dự án ứng dụng sử dụng Xcode, thêm Tăng tốc Framework, tạo ra hai file C: matinv.h, matinv.c và chỉnh sửa các tập tin main.m để loại bỏ Cocoa điều:
// main.m
#import "matinv.h"
int main(int argc, char *argv[])
{
int N = 3;
double A[N*N];
A[0] = 1; A[1] = 1; A[2] = 7;
A[3] = 1; A[4] = 2; A[5] = 1;
A[6] = 1; A[7] = 1; A[8] = 3;
matrix_invert(N, A);
// [ -1.25 -1.0 3.25 ]
// A^-1 = [ 0.5 1.0 -1.5 ]
// [ 0.25 0.0 -0.25 ]
return 0;
}
Bây giờ các tập tin header,
// matinv.h
int matrix_invert(int N, double *matrix);
và sau đó tập tin nguồn,
int matrix_invert(int N, double *matrix) {
int error=0;
int *pivot = malloc(N*sizeof(int)); // LAPACK requires MIN(M,N), here M==N, so N will do fine.
double *workspace = malloc(N*sizeof(double));
/* LU factorisation */
dgetrf_(&N, &N, matrix, &N, pivot, &error);
if (error != 0) {
NSLog(@"Error 1");
free(pivot);
free(workspace);
return error;
}
/* matrix inversion */
dgetri_(&N, matrix, &N, pivot, workspace, &N, &error);
if (error != 0) {
NSLog(@"Error 2");
free(pivot);
free(workspace);
return error;
}
free(pivot);
free(workspace);
return error;
}
Tham chiếu LAPACK kinh điển là LAPACK Sử dụng r Hướng dẫn. (http://www.netlib.org/lapack/lug/) –
Tôi đang gặp sự cố khi quét thư viện khó hiểu này (để nói ít nhất) là LAPACK. Làm cách nào để tôi có thể điều chỉnh mã này thành phao chính xác đơn? –
Ồ, tôi đã tìm thấy nó: sgetrf_ và sgetri_ (S cho "độ chính xác đơn"?) –