我正在使用 C++ 和 CUDA 实现一个算法。但当我试图找到特殊矩阵的逆矩阵时,我遇到了麻烦。
该矩阵具有以下特点:
- 它是一个方阵(假设:(m+3)x(m+3),m>0);
- 它的转置矩阵是它本身;
- 它的主对角线必须为零;
- 它的右下角必须有一个 3x3 零矩阵;
- 你可以考虑这种形式的矩阵:H = [A ,B ;B' ,0];
我尝试了一些方法但都失败了:
-
伪逆矩阵:
我最初使用 matlab,当我尝试使用 inv(H'*H) 时出现错误或警告:警告:矩阵对于工作精度来说是奇异的 or 矩阵接近奇异或缩放不良
-
一些近似方法:
参考资料在这里:近似 http://hgpu.org/?p=6093我发现了两种方法:高斯乔丹消除法和乔列斯基分解法。当我在matlab中尝试chol时,我得到以下结果错误:矩阵必须是正定的
有人可以给我一些建议吗?
最好了解有关您的具体问题的更多信息,特别是如果您需要逆per se或者如果您只需要反转线性方程组。我将尽力为您提供这两种情况的指导。
让我首先考虑一下您的矩阵几乎是奇异的,因此您的系统是病态的。
确定近奇异矩阵的逆
正如上面的评论和答案中已经阐明的那样,求近奇异矩阵的逆是没有意义的。有意义的是构建一个正则化的你的矩阵的逆矩阵。您可以通过矩阵的谱分解(奇异值分解或 SVD)来实现这一点。更详细地说,您可以构造奇异系统,删除最不重要的奇异值(这些奇异值是矩阵近奇异行为的来源),然后使用奇异值和向量形成近似逆矩阵。当然,在这种情况下A*A_inv
只会给出单位矩阵的近似值。
如何在 GPU 上完成此操作?首先,我要说的是,用 C++ 或 CUDA 实现 SVD 算法绝非易事。您应该根据所需的精度(例如,确定奇异值)来选择多种技术。不管怎样,Matlab有一套在 GPU 上运行的线性代数函数 http://www.mathworks.it/discovery/matlab-gpu.html. Also, CULA http://www.culatools.com/ and Magma http://icl.cs.utk.edu/magma/是两个提供 SVD 计算例程的库。另外,您可以考虑使用阵列火 http://www.accelereyes.com/products/arrayfire它还提供线性代数例程,包括 SVD。
反转一个近乎奇异的系统
在这种情况下,您应该考虑使用某种吉洪诺夫正则化,其中包括将线性系统的反演表示为优化问题并添加正则化项,这可能取决于您已经了解的有关未知数的特征。
对于上述两种情况,我建议阅读一些理论。这本书
M. Bertero,P. Boccacci,成像反问题简介 https://rads.stackoverflow.com/amzn/click/com/0750304359
如果您必须找到近似逆函数或者您有显式逆线性系统,那么这将很有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)