我想找到矩陣的逆。如何使用加速框架執行矩陣逆運算?
我知道這涉及到第一個LU因式分解然後是反演步驟,但我無法通過搜索蘋果的10.7文檔來找到所需的功能!
這似乎是一個有用的帖子Symmetric Matrix Inversion in C using CBLAS/LAPACK,指出應該使用sgetrf_
和sgetri_
函數。然而,搜索這些術語我在Xcode文檔中找不到任何東西。
有沒有人有這種矩陣操作的鍋爐代碼?
我想找到矩陣的逆。如何使用加速框架執行矩陣逆運算?
我知道這涉及到第一個LU因式分解然後是反演步驟,但我無法通過搜索蘋果的10.7文檔來找到所需的功能!
這似乎是一個有用的帖子Symmetric Matrix Inversion in C using CBLAS/LAPACK,指出應該使用sgetrf_
和sgetri_
函數。然而,搜索這些術語我在Xcode文檔中找不到任何東西。
有沒有人有這種矩陣操作的鍋爐代碼?
Apple根本沒有記錄LAPACK代碼,我猜是因爲他們只是實現了netlib.org的標準接口。很遺憾,您無法從內置的Xcode文檔中搜索這些函數名稱,但解決方案非常簡單:只需在URL中指定函數名稱即可爲dgetrf_()
去,http://www.netlib.org/clapack/what/double/dgetrf.c。
要反轉矩陣,需要兩個LAPACK函數:執行LU分解的dgetrf_()
,以及執行前一個函數的輸出並執行實際的反轉的dgetri_()
。
我創建了一個標準的應用程序項目使用Xcode中,增加了加速框架,創建兩個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;
}
的規範LAPACK引用是使用LAPACK r的指南。 (http://www.netlib.org/lapack/lug/) –
我在掃描這個神祕的(至少是說)LAPACK庫時遇到了麻煩。我怎樣才能使這個代碼適應單精度浮點數? –
哦,我發現它:sgetrf_和sgetri_(S爲「單精度」?) –