我想在C++中计算矩阵的Moore-Penrose伪逆,有人可以指向我的库实现或数字配方吗?
谢谢!
在我在C中工作的数值解算器中,我需要反转2x2矩阵,然后在右侧乘以另一个矩阵:
C = B . inv(A)
Run Code Online (Sandbox Code Playgroud)
我一直在使用倒置2x2矩阵的以下定义:
a = A[0][0];
b = A[0][1];
c = A[1][0];
d = A[1][1];
invA[0][0] = d/(a*d-b*c);
invA[0][1] = -b/(a*d-b*c);
invA[1][0] = -c/(a*d-b*c);
invA[1][1] = a/(a*d-b*c);
Run Code Online (Sandbox Code Playgroud)
在我解算器的前几次迭代中,这似乎给出了正确的答案,然而,经过几个步骤后,事情开始增长并最终爆炸.
现在,与使用SciPy的实现相比,我发现相同的数学不会爆炸.我能找到的唯一区别是SciPy代码使用scipy.linalg.inv(),它在内部使用LAPACK来执行反转.
当我用inv()上面的计算替换调用时,Python版本确实会爆炸,所以我很确定这是问题所在.计算中的微小差异正在蔓延,这使我相信它是一个数值问题 - 对于反演操作并不完全令人惊讶.
我正在使用双精度浮点数(64位),希望数值问题不会成为问题,但显然情况并非如此.
但是:我想在我的C代码中解决这个问题,而不需要调用像LAPACK这样的库,因为将它移植到纯C的全部原因是让它在目标系统上运行.此外,我想了解这个问题,而不仅仅是呼唤黑匣子.最终,如果可能的话,我也希望它以单精度运行.
所以,我的问题是,对于这样一个小矩阵,有一个数值上更稳定的方法来计算A的倒数吗?
谢谢.
编辑:目前试图弄清楚我是否可以通过解决来避免反演C.
以下动态数组包含非对称n*n矩阵(n <= 100):
int **matrix;
matrix = new int*[n];
for (int i = 0; i < n; i++)
matrix[i] = new int[n];
Run Code Online (Sandbox Code Playgroud)
是否有一种非常简单的方法来反转它?理想情况下,我只使用STL中的某些内容或下载单个头文件.
我有一个问题,我找不到任何解决方案.
我必须用一个已知矩阵的逆来进行一些计算.
Matrix homography=
1.1688, 0.23, 62.2,
-0.013,1.225, -6.29,
0, 0, 1,
Run Code Online (Sandbox Code Playgroud)
然后:
Mat homoInv=homography.inv();
Run Code Online (Sandbox Code Playgroud)
矩阵的内容将是:
1.81381e-29, 15.1628, -7.57361e+17,
0, -0, 0,
5.4561e-33, -2.40123e+34, -1.38198e-05
Run Code Online (Sandbox Code Playgroud)
那当然是错的,因为我已经在Matlab中检查了结果.两个矩阵都显示并作为浮点读取,它们的深度为a 64FC1.
有没有人知道可以做些什么?
谢谢大家
更多代码:
int main(int argc, char ** argv )
{
Mat homogra(3,3,CV_64FC1);
Mat coord(3,1,CV_64FC1);
Mat result(target.size(),CV_8UC1);
homogra.at<float>(0,0)=1.1688;
homogra.at<float>(0,1)=0.23;
homogra.at<float>(0,2)=(-62.20);
homogra.at<float>(1,0)=(-0.013);
homogra.at<float>(1,1)=1.225;
homogra.at<float>(1,2)=-6.29;
homogra.at<float>(2,0)=0;
homogra.at<float>(2,1)=0;
homogra.at<float>(2,2)=1;
printMatrix(homogra);
Mat inverse=homogra.inv();
printMatrix(inverse);
}
Run Code Online (Sandbox Code Playgroud)
function printMatrix:
void printMatrix(Mat M){
cout<<"Tipo de matriz:"<<M.type()<<endl;
// dont print empty matrices
if (M.empty()){
cout << "---" << endl;
return; …Run Code Online (Sandbox Code Playgroud) 我对R语言很陌生,试图找出如何计算非平方矩阵的逆矩阵.(非正方形?不规则?我不确定正确的术语).
从我的书和快速谷歌搜索,(见源代码),我发现你可以solve(a)用来找到矩阵的逆矩阵,如果 a是正方形.
我创建的矩阵是,据我所知,不是正方形:
> matX<-matrix(c(rep(1, 8),2,3,4,0,6,4,3,7,-2,-4,3,5,7,8,9,11), nrow=8, ncol=3);
> matX
[,1] [,2] [,3]
[1,] 1 2 -2
[2,] 1 3 -4
[3,] 1 4 3
[4,] 1 0 5
[5,] 1 6 7
[6,] 1 4 8
[7,] 1 3 9
[8,] 1 7 11
>
Run Code Online (Sandbox Code Playgroud)
是否有一个函数来解决这个大小的矩阵,还是我必须对每个元素做一些事情?因为该solve()函数给出了这个错误:
Error in solve.default(matX) : 'a' (8 x 3) must be square
Run Code Online (Sandbox Code Playgroud)
我想从上面的矩阵中实现的计算是: (matX'matX)^-1
提前致谢.
我有一个尺寸为row x cols x deps的3D图像.对于图像中的每个体素,我计算了一个3x3实对称矩阵.它们存储在阵列D中,因此具有形状(行,列,凹陷,6).
D为我的图像中的每个体素存储3x3对称矩阵的6个独特元素.我需要在矢量化代码中同时找到所有行*cols*deps矩阵的Moore-Penrose伪逆(循环遍历每个图像体素,并且在Python中反转太慢).
这些3x3对称矩阵中的一些是非奇异的,我可以在矢量化代码中找到它们的逆,使用非奇异3x3对称矩阵的真逆的解析公式,我已经这样做了.
然而,对于那些单数的矩阵(并且肯定会有一些),我需要Moore-Penrose伪逆.我可以得出一个真实的,奇异的,对称的3x3矩阵的MP的解析公式,但它是一个非常讨厌/冗长的公式,因此会涉及非常大量(元素方面)矩阵算法和相当多的混乱寻找代码.
因此,我想知道是否有一种方法可以同时在数字上同时找到所有这些矩阵的MP伪逆.有没有办法做到这一点?
感激不尽,GF
嗨,我一直在做关于矩阵求逆(线性代数)的研究,我想用C++模板编程算法,我发现有很多方法,如:Gauss-Jordan消除或LU分解,我发现函数LU_factorize(c ++ boost library)
从程序员或数学家的角度来看,我想知道是否有其他方法,哪一个更好(优点/缺点)?
如果没有其他更快的方法,那么在boost库中已经存在(矩阵)反转功能?,因为我搜索了很多,没有找到任何.
我正在寻找一个包含pinv的C++库(MATLAB中的伪逆矩阵运算).我试图使用Armadillo但它缺少多线程调试DLL(/ MDd),但我需要这种类型的lib用于我的项目.检查一下.
如果您可以共享该版本的lib或提出替代轻量级库,我将非常高兴.
我正在用犰狳 C++ (4.400.1) 编写程序
我有一个必须稀疏且复杂的矩阵,并且我想计算该矩阵的逆矩阵。由于它是稀疏的,因此可能是伪逆矩阵,但我可以保证矩阵具有完整的对角线。
在Armadillo的API文档中,提到了.i()计算任意矩阵的逆的方法,但是sp_cx_mat成员中不包含这样的方法,并且inv()orpinv()函数显然无法处理该sp_cx_mat 类型。
sp_cx_mat Y;
/*Fill Y ensuring that the diagonal is full*/
sp_cx_mat Z = Y.i();
Run Code Online (Sandbox Code Playgroud)
或者
sp_cx_mat Z = inv(Y);
Run Code Online (Sandbox Code Playgroud)
它们都不起作用。
我想知道如何计算sp_cx_mat类型矩阵的逆。
我正在尝试以最有效的方式求解带状稀疏矩阵的逆,以便我可以将其合并到我的实时系统中。我正在生成表示卷积运算的稀疏带状矩阵。目前,我正在使用图书馆spsolve的内容scipy.sparse.linalg。solve_banded我发现使用图书馆有更好的方法scipy.linalg。然而,solve_banded需要(l,u)哪个是非零下对角线和上对角线的数量以及ab哪个(l + u + 1, M)数组像带状矩阵。我不确定如何转换我的代码以便我可以使用solve_banded. 非常感谢这方面的任何帮助。
import numpy as np
from scipy import linalg
import math
import time
from scipy.sparse import spdiags
from scipy.sparse.linalg import spsolve
def ABC(deg, fc, N):
r"""Generate sparse-banded matrices
"""
omc = 2*math.pi*fc
t = ((1-math.cos(omc))/(1+math.cos(omc)))**deg
p = 1
for k in np.arange(deg):
p = np.convolve(p,np.array([-1,1]),'full')
P = spdiags(np.kron(p,np.ones((N,1))).T, np.arange(deg+1), N-deg, N)
B = P.T.dot(P)
q = …Run Code Online (Sandbox Code Playgroud)