苹果公司没有对LAPACK代码进行文档记录,我猜测这是因为他们只是实现了来自netlib.org的标准接口。很遗憾你不能在内置的Xcode文档中搜索这些函数名称,但解决方案非常简单:只需在URL中指定函数名称,例如对于dgetrf_()
,转到http://www.netlib.org/clapack/what/double/dgetrf.c。
要反转一个矩阵需要使用两个LAPACK函数:dgetrf_()
,它执行LU分解,以及dgetri_()
,它接收前一个函数的输出并执行实际的反转。
我使用Xcode创建了一个标准应用程序项目,添加了加速框架,创建了两个C文件:matinv.h、matinv.c,并编辑了main.m文件以删除Cocoa相关内容:
// main.m
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));
double *workspace = malloc(N*sizeof(double));
dgetrf_(&N, &N, matrix, &N, pivot, &error);
if (error != 0) {
NSLog(@"Error 1");
free(pivot);
free(workspace);
return error;
}
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;
}
N*sizeof(int)
。 - combinatorial