2012-07-01 7 views
5

매트릭스의 역함수를 찾고 싶습니다.가속 프레임 워크를 사용하여 행렬 역 연산을 수행하는 방법은 무엇입니까?

나는 이것이 최초의 LU 요소 분해와 역전 단계를 포함하고 있지만, 10.7의 사과의 문서를 검색하여 필요한 기능을 찾을 수 없다는 것을 알고있다!

유용한 게시물 및 sgetri_ 기능을 사용해야한다는 점을 알 수 있습니다.이 게시물은 Symmetric Matrix Inversion in C using CBLAS/LAPACK과 같습니다. 그러나 이러한 용어를 검색하면 Xcode 문서에서 아무 것도 찾을 수 없습니다.

누구나이 매트릭스 작동을위한 보일러 플레이트 코드를 가지고 있습니까?

답변

13

Apple은 LAPACK 코드를 전혀 문서화하지 않았습니다. 표준 인터페이스가 단지 netlib.org에서 구현 되었기 때문입니다. 내장 Xcode 문서에서 이러한 함수 이름을 검색 할 수는 없지만 솔루션은 매우 간단합니다. 예를 들어 URL에 함수 이름 만 지정하면됩니다. dgetrf_()의 경우 http://www.netlib.org/clapack/what/double/dgetrf.c으로 이동하십시오.

두 개의 LAPACK 함수를 필요로합니다 : LU factorisation을 수행하는 dgetrf_()과 이전 함수의 출력을 받아 실제 반전을 수행하는 dgetri_().

본인은이 프레임 워크를 가속화 두 개의 C 파일 생성 추가, 표준 응용 프로그램 프로젝트 사용하여 엑스 코드를 생성 : matinv.h, matinv.c 및 코코아 것들을 제거 할 main.m 파일 편집 : 이제

// 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; 
} 

을 헤더 파일, 다음

// matinv.h 

int matrix_invert(int N, double *matrix); 

및 소스 파일,

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

정규 LAPACK 참조는 LAPACK 사용입니다 r 's 가이드. (http://www.netlib.org/lapack/lug/) –

+0

LAPACK 인이 신빙성있는 라이브러리를 스캔하는 데 문제가 있습니다. 이 코드를 단 정밀도 부동 소수점에 적용하려면 어떻게해야합니까? –

+0

오, 찾았습니다 : sgetrf_와 sgetri_ ("단 정밀도"는?) –