2012-07-01 35 views
5

Tôi muốn tìm nghịch đảo của ma trận.Làm thế nào để thực hiện hoạt động nghịch đảo ma trận bằng cách sử dụng khung tăng tốc?

Tôi biết điều này liên quan đến yếu tố LU đầu tiên sau đó là bước đảo ngược nhưng tôi không thể tìm thấy chức năng được yêu cầu bằng cách tìm kiếm tài liệu của apple 10,7!

Điều này có vẻ giống như một bài đăng hữu ích Symmetric Matrix Inversion in C using CBLAS/LAPACK, chỉ ra rằng các chức năng sgetrf_sgetri_ sẽ được sử dụng. Tuy nhiên, tìm kiếm những thuật ngữ này tôi không tìm thấy gì trong tài liệu Xcode.

Có ai có mã tấm nồi hơi cho hoạt động ma trận này không?

Trả lời

13

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; 
} 
+1

Tham chiếu LAPACK kinh điển là LAPACK Sử dụng r Hướng dẫn. (http://www.netlib.org/lapack/lug/) –

+0

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? –

+0

Ồ, tôi đã tìm thấy nó: sgetrf_ và sgetri_ (S cho "độ chính xác đơn"?) –