我想反转一个4x4矩阵.我的数字以定点格式存储(准确地说是1.15.16).
使用浮点运算,我通常只需构建伴随矩阵并除以行列式(例如强力解决方案).到目前为止,这对我有用,但在处理定点数时,由于使用了所有乘法,我得到了不可接受的精度损失.
注意:在定点运算中,我总是丢弃一些立即结果的最低有效位.
那么 - 反转矩阵的数值最稳定的方法是什么?我不太关心性能,但简单地说浮点就是放慢我的目标架构.
language-agnostic fixed-point matrix linear-algebra matrix-inverse
我正在尝试用Java计算逆矩阵.
我正在遵循伴随方法(首先计算伴随矩阵,然后转置这个矩阵,最后,将它乘以行列式值的倒数).
它在矩阵不太大时起作用.我已经检查过,对于尺寸为12x12的矩阵,可以快速得到结果.但是,当矩阵大于12x12时,完成计算所需的时间呈指数增长.
我需要反转的矩阵是19x19,需要花费太多时间.更多时间消耗的方法是用于计算行列式的方法.
我正在使用的代码是:
public static double determinant(double[][] input) {
int rows = nRows(input); //number of rows in the matrix
int columns = nColumns(input); //number of columns in the matrix
double determinant = 0;
if ((rows== 1) && (columns == 1)) return input[0][0];
int sign = 1;
for (int column = 0; column < columns; column++) {
double[][] submatrix = getSubmatrix(input, rows, columns,column);
determinant = determinant + sign*input[0][column]*determinant(submatrix);
sign*=-1;
}
return determinant;
}
Run Code Online (Sandbox Code Playgroud)
有人知道如何更有效地计算大矩阵的行列式吗?如果没有,有没有人知道如何使用其他算法计算大矩阵的逆?
谢谢
我试图使用numpy或scipy在python中获得非方阵的左逆.如何将以下Matlab代码翻译成Python?
>> A = [0,1; 0,1; 1,0]
A =
0 1
0 1
1 0
>> y = [2;2;1]
y =
2
2
1
>> A\y
ans =
1.0000
2.0000
Run Code Online (Sandbox Code Playgroud)
\在Matlab中是否存在numpy或scipy等效的左逆算子?
我有很多大的(大约5000 x 5000)矩阵,我需要在Matlab中反转.我实际上需要逆,所以我不能使用mldivide,这对于解决一个b的Ax = b要快得多.
我的矩阵来自一个问题,这意味着他们有一些不错的属性.首先,他们的决定因素是1,所以他们肯定是可逆的.但它们不是可对角化的,或者我会尝试对它们进行对角化,将它们反转,然后将它们放回去.他们的条目都是实数(实际上是理性的).
我正在使用Matlab来获取这些矩阵,对于这些东西,我需要对它们的反转进行处理,所以我更喜欢一种方法来加速Matlab.但是,如果有另一种语言,我可以使用它会更快,那么请让我知道.我不知道很多其他语言(一点点但只有C和一点点但是Java),所以如果它在其他语言中真的很复杂,那么我可能无法使用它.请继续并建议,以防万一.
这可能是一个非常基本的问题,但我还没有找到解决方案,而且一直困扰着我.我想在Maya中显示指示摄像机右下角的世界坐标方向(x,y,z)的箭头,以便在围绕对象旋转摄像机或在场景中移动时,你仍然可以识别世界坐标的方向.我试图用两种不同的方法来实现这一点,到目前为止都没有.
我有一个带有三个箭头的对象作为使用THREE.ArrowHelper该类的孩子,我们XYZ暂时会调用它.第一种方法是制作XYZ一个场景的孩子,并根据摄像机的当前位置计算出一个位置,加上摄像机指向的方向上的偏移量并进行调整,使其显示在我希望它而不是在中心的角落里的屏幕.我几乎得到了这个工作,因为箭头保持正确的旋转,但位置有点滑稽,我停止沿着这条路线,因为当移动相机时它真的是"紧张".我不确定这是性能问题还是其他问题.
第二种方法是使XYZ相机的孩子具有局部位置偏移,然后反转相机的旋转并应用反向旋转以XYZ使其匹配世界坐标.我似乎很接近使用这种方法,但我可以得到正确的位置,或正确的旋转,而不是两者.
我目前正在使用代码XYZ.matrix.extractRotation( camera.matrixWorldInverse );为我提供正确的方向XYZ,但它的定位是关闭的.如果我使用,XYZ.matrixWorld.extractRotation( camera.matrixWorldInverse );那么位置保持正常(连接到相机)但方向不会改变.
如果有人快速破解这项工作,我将不胜感激.如果你有一个比我正在追求的方法更好的方法,那么这也会有所帮助.
** - 编辑 - **应该提一下,你可以在这里找到工作版本 - (https://googledrive.com/host/0B45QP71QXoR0Mm9Mbkp3WGI1Qkk/)我将我的代码存储在谷歌驱动器中,但使用wamp和aliasing在本地工作意味着我在本地进行的任何更改都会在谷歌驱动器同步后立即在线反映出来.IE看起来可能会被打破.
matrix-inverse coordinate-systems rotational-matrices three.js
我有一个严重条件矩阵,它rcond()接近于零,因此,该矩阵的逆矩阵并不正确.我尝试过使用,pinv()但这并没有解决问题.这就是我采取相反的方式:
X = (A)\(b);
Run Code Online (Sandbox Code Playgroud)
我查找了这个问题的解决方案,并找到了改进矩阵的链接(最后的解决方案).那里的解决方案建议使用这个:
A_new = A_old + c*eye(size(A_old));
Run Code Online (Sandbox Code Playgroud)
哪里c > 0.到目前为止,采用这种技术可以使基质A更好地调节,并且所得溶液看起来更好.但是,我研究了使用不同的值,c所得到的解决方案取决于所选择的值c.
除了手动调查价值之外c,是否有一种自动方式可以找到c我获得最佳解决方案的价值?
在numpy/ scipy,什么是计算上三角矩阵的逆的规范方法?
矩阵存储为numpy具有零个子对角线元素的2D 阵列,并且结果也应该存储为2D阵列.
编辑到目前为止我发现的最好的是scipy.linalg.solve_triangular(A, np.identity(n)).是吗?
我试图用C++计算一个非常大的矩阵(11300x21500)的逆.到目前为止,我已经尝试了Eigen和Armadillo库,但都在初始化阶段失败,说没有足够的内存.有没有办法克服这种情况?
提前致谢
PS
我应该将矩阵的大小更正为21500x21500.正如UmNyobe所说,这不是方阵.它实际上是观察矩阵X,我试图计算(X T X)-1
我有一个8GB内存(在64位系统中),但我不认为我正在利用所有这些内存空间.任务管理器显示错误时的内存使用量为1GB.也许Windows7中有一个操作系统命令可以在内存使用量超过1GB时关闭应用程序.
顺便说一句,我最初的目的是对这个观察矩阵进行回归.
还有一件事:观察矩阵X的每一行中的大多数列都是零.有没有办法利用这个,限制反相操作中的内存使用?
什么是最快的算法(链接到C或C++的例子很酷)来检查小方矩阵(<16*16元素)是否是单数(不可逆,det = 0)?
如何确定矩阵在R中是否有倒数?
因此在R中有一个带矩阵输入的函数,会返回一些像:
" TRUE "(此矩阵具有反转)/" FALSE "(它没有......).
matrix-inverse ×10
matrix ×6
matlab ×3
algorithm ×2
numpy ×2
python ×2
c++ ×1
determinants ×1
fixed-point ×1
java ×1
performance ×1
r ×1
regularized ×1
scipy ×1
three.js ×1