如何使用加速框架执行矩阵逆运算?

Dan*_*ell 5 matrix-inverse lapack accelerate-framework osx-lion

我想找到矩阵的逆.

我知道这涉及到第一次LU分解然后是反转步骤但是我找不到所需的功能,通过搜索苹果的10.7文档!

这似乎是使用CBLAS/LAPACK在C中有用的后对称矩阵求逆,指出应该使用sgetrf_sgetri_函数.但是在搜索这些术语时,我在Xcode文档中找不到任何内容.

有没有人有这种矩阵运算的锅炉板代码?

Dan*_*ell 14

Apple根本没有记录LAPACK代码,我想因为他们只是从netlib.org实现了标准接口.遗憾的是,您无法从内置的Xcode文档中搜索这些函数名称,但是解决方案非常简单:只需在URL中指定函数名称,例如dgetrf_()转到http://www.netlib.org/ clapack/what/double/dgetrf.c.

要反转矩阵,需要两个LAPACK函数:dgetrf_()执行LU分解,并dgetri_()获取前一个函数的输出并进行实际反演.

我使用Xcode创建了一个标准的Application Project,添加了Accelerate Framework,创建了两个C文件:matinv.h,matinv.c并编辑了main.m文件来删除Cocoa的东西:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

现在是头文件,

//  matinv.h

int matrix_invert(int N, double *matrix);
Run Code Online (Sandbox Code Playgroud)

然后是源文件,

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;
}
Run Code Online (Sandbox Code Playgroud)