gpt4 book ai didi

osx-lion - 如何使用加速框架进行矩阵求逆运算?

转载 作者:行者123 更新时间:2023-12-02 05:10:56 24 4
gpt4 key购买 nike

我想求矩阵的逆矩阵。

我知道这首先涉及 LU 因式分解,然后是求逆步骤,但我无法通过搜索苹果 10.7 的文档找到所需的函数!

这似乎是一篇有用的帖子 Symmetric Matrix Inversion in C using CBLAS/LAPACK ,指出应该使用 sgetrf_sgetri_ 函数。然而,在 Xcode 文档中搜索这些术语时我找不到任何内容。

有人有这个矩阵运算的样板代码吗?

最佳答案

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

要反转矩阵,需要两个 LAPACK 函数:dgetrf_()(执行 LU 分解)和 dgetri_()(它获取前一个函数的输出并执行此操作)实际的反转。

我使用 Xcode 创建了一个标准应用程序项目,添加了 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;
}

现在是头文件,

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

关于osx-lion - 如何使用加速框架进行矩阵求逆运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11282746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com