关键词:
【中文标题】上三角矩阵的矩阵逆计算给出了大矩阵维度的误差【英文标题】:Matrix inverse calculation of upper triangular matrix gives error for large matrix dimensions 【发布时间】:2020-02-08 22:50:46 【问题描述】:我有一个递归函数来计算上三角矩阵的逆矩阵。我将矩阵分为顶部、底部和角落部分,然后遵循https://math.stackexchange.com/a/2333418 中规定的方法。这是一个伪代码形式:
//A diagram structure of the Matrix
Matrix = [Top Corner]
[0 Bottom]
Matrix multiply_matrix(Matrix A, Matrix B)
Simple Code to multiply two matrices and return a Matrix
Matrix simple_inverse(Matrix A)
Simple Code to get inverse of a 2x2 Matrix
Matrix inverse_matrix(Matrix A)
//Creating an empty A_inv matrix of dimension equal to A
Matrix A_inv;
if(A.dimension == 2)
A_inv = simple_inverse(A)
else
Top_inv = inverse_matrix(Top);
(Code to check Top*Top_inv == Identity Matrix)
Bottom_inv = inverse_matrix(Bottom);
(Code to check Bottom*Bottom_inv == Identity Matrix)
Corner_inv = multiply_matrix(Top_inv, Corner);
Corner_inv = multiply_matrix(Corner_inv, Bottom_inv);
Corner_inv = negate(Corner_inv); //Just a function for negation of the matrix elements
//Code to copy Top_inv, Bottom_inv and Corner_inv to A_inv
...
...
return A_inv;
int main()
matrix A = An upper triangular matrix with random integers between 1 and 9;
A_inv = inverse_matrix(A);
test_matrix = multiply_matrix(A, A_inv);
(Code to Raise error if test_matrix != Identity matrix)
为简单起见,我已经实现了只支持二维矩阵的幂的代码。
我的问题是我已经针对 2、4、8、16、32 和 64 的矩阵维度测试了这段代码。所有这些都通过了代码中所示的所有断言检查。 但是对于 128 的矩阵维度,我得到的失败是 main() 中的断言。当我检查时,我观察到 test_matrix 不是身份矩阵。一些非对角元素不等于 0。 我想知道这可能是什么原因:-
-
我正在使用 C++
std::vector<std::vector<double>>
进行矩阵表示。
由于数据类型是double
,对于情况 2、4、8、...、64,test_matrix 的非对角元素确实有一些价值,但非常小。例如,-9.58122e-14
我在任何递归阶段的所有矩阵都是方阵
我正在检查Top*Top_inv = Identity
和Bottom*Bottom_inv = Identity
。
最后,对于维度 2、4、...、64,我生成了随机数(b/w 1 和 10)来创建我的上三角矩阵。既然这些案例都通过了,我想我的数学实现是正确的。
我觉得 C++ 数据类型的某些方面是关于 double 的,我不知道这可能会导致错误。否则 64->128 的突然错误没有意义。
【问题讨论】:
当增加大小时,随机矩阵越来越病态,这增加了最终的路由错误,即使是double
。在这里,您可以通过计算最大对角元素与最小对角元素之间的比率(绝对值)来评估它。
【参考方案1】:
能否详细说明matrix == identity
操作是如何实现的?
我的猜测是,问题可能会恢复到浮点比较。
在最坏的情况下,矩阵求逆可能是 O(n^3)。这意味着,随着矩阵大小的增加,所涉及的计算量也会增加。即使使用 64 位浮点数也无法完美表示实数,它们始终是近似值。
对于诸如矩阵求逆之类的运算,这可能会导致数值误差传播的问题,因为累积的乘加运算会损失精度。
对此,*** 中已经有讨论:How should I do floating point comparison?
编辑:如果整个矩阵实际上是可逆的,则需要考虑其他事情。 也许顶部和/或底部矩阵是可逆的,但完整的矩阵(与 Corner 矩阵组合时)不是。
【讨论】:
我认为 matrix==identity 计算没有错误。因为我有代码来检查“test_matrix”的元素。 test_matrix 应该几乎等同于身份矩阵,但这在我的情况下是失败的。有趣的是,只有矩阵“角”区域中的元素具有非零值。因此,“数值误差传播”可能是问题所在,但我的“顶部”和“底部”矩阵是正确的,所以不确定为什么“角”矩阵计算会出错。 那我可能离这里很远,但是,如果顶部和底部矩阵不是奇异的,但整个矩阵是奇异的或条件不好怎么办? @Caceres 我认为您关于“数字错误传播”的想法是正确的。为了进行实验,我将数据类型从“双”更改为“浮点”。现在我也遇到了 32 和 64 矩阵维度的错误。我的猜测是,在矩阵乘法中,C[i][j] += A[i][k]*B[k][j];
是发生错误传播的地方。但是我不知道如何解决这个问题。
注意:当所有对角线元素都不为空时,三角形矩阵在理论上是可转换的。这里的问题似乎是大型随机矩阵的病态
@Damien 是的,你是对的。我的矩阵是病态的。我认为我对此很好,因为我了解错误的根本原因是什么。谢谢!!从下/上三角矩阵中给出一个元素
】从下/上三角矩阵中给出一个元素【英文标题】:Givinganelementfromlower/uppertriangularmatrix【发布时间】:2016-09-3014:35:17【问题描述】:我有一个矩阵的上三角部分,主对角线存储为一个线性数组,如何从数组的线性索引中提取矩阵... 查看详情
判断上三角行列式(代码片段)
...随堂练习3】【习题7-三-3】【必须用二维数组】判断上三角矩阵(15分)上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。输... 查看详情
第三周编程总结
7-1判断上三角矩阵(15分)上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。输入格式:输入第一行给出一个正整数T,为待测... 查看详情
7-1判断上三角矩阵(15分)(代码片段)
7-1判断上三角矩阵(15分)上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。输入格式:输入第一行给出一个正整数T,为待测... 查看详情
7-1判断上三角矩阵(代码片段)
7-1判断上三角矩阵(15分)上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。输入格式:输入第一行给出一个正整数T,为待测... 查看详情
02矩阵01——基本矩阵:对角矩阵方幂数量矩阵转置矩阵对称矩阵逆矩阵奇异矩阵三角矩阵
为啥我必须计算模型矩阵的逆矩阵的转置才能计算反射纹理的法线?
】为啥我必须计算模型矩阵的逆矩阵的转置才能计算反射纹理的法线?【英文标题】:WhydoIhavetocalculatethetransposeoftheinverseofthemodelmatrixinordertocalculatethenormalforthereflectiontexture?为什么我必须计算模型矩阵的逆矩阵的转置才能计算反... 查看详情
使用 biogo 计算矩阵逆?
】使用biogo计算矩阵逆?【英文标题】:Computematrixinverseusingbiogo?【发布时间】:2013-12-1217:58:04【问题描述】:我正在研究Go中的卡尔曼滤波器实现。看完this线程后,我决定使用biogo进行矩阵运算。但是,从thedocumentation看来,biogo... 查看详情
第一章矩阵和高斯消元法
消元法解方程,将矩阵化成上三角或者下三角矩阵:有100个等式的方程的消法需要3分之百万步(乘法和减法),接近百万步的时候,舍入误差将会很大。 行列式法(当矩阵变大时运算量急剧增大):消元法是当前普遍采用... 查看详情
表示下/上三角矩阵的有效方法
】表示下/上三角矩阵的有效方法【英文标题】:efficientwaytorepresentalower/uppertriangularmatrix【发布时间】:2011-12-1805:53:10【问题描述】:我正在使用二维的C/C++程序处理我的数据。这里我的值是成对计算的,foo[i][j]和foo[j][i]的值相同... 查看详情
python与数据分析numpy数值计算基础——补充(代码片段)
目录二、矩阵生成与常用操作1.生成矩阵2.矩阵转置3.查看矩阵特征4.矩阵乘法5.计算相关系数矩阵6.计算方差、协方差、标准差7.行列扩展8.常用变量9.矩阵在不同维度上的计算10.应用(1)使用蒙特·卡罗方法估计圆周率的... 查看详情
第三周编程总结
7-1 判断上三角矩阵 (15 分)上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。输入格式:输入第一行给出一个正... 查看详情
上三角下三角对称矩阵
/*上三角下三角对称矩阵说明:上三角矩阵是矩阵在对角线以下的元素均为0,即Aij=0,i>j,例如:1234506789001011120001314000015下三角矩阵是矩阵在对角线以上的元素均为0,即Aij=0,i<j,例如:1000026000371000481113059121415对称... 查看详情
三角矩阵的压缩存储
一、三角矩阵的分类三角矩阵大体分三类:下三角矩阵、上三角矩阵、对称矩阵。二、矩阵压缩存储以n*n的下三角矩阵(这里i<j时,元素为0,也可以为其他的数)为例: 下三角矩阵的压缩存储原则是只存储下三... 查看详情
使用 cublasSgetriBatched 在 gpu 上求逆两个矩阵
】使用cublasSgetriBatched在gpu上求逆两个矩阵【英文标题】:InversionoftwomatricesonagpuusingcublasSgetriBatched【发布时间】:2021-07-2604:50:46【问题描述】:我是cublas的新手。我想在GPU上并行计算两个矩阵的逆。矩阵是[48;39]和[52;17]。是否可... 查看详情
矩阵的一些性质
...一个递归求解行列式的方法,它的复杂度为O(n!)。上三角矩阵下三角矩阵LU分解:将一个n阶矩阵A拆分成一个上三角矩阵L和一个下三角矩阵U,A=LU。一个n阶矩阵存在LU分解当且仅当这个矩阵存在逆矩阵 查看详情
第三周编程总结(代码片段)
题目一、判断上三角矩阵上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。输入格式:输入第一行给出一个正整数T,为待测... 查看详情
行最简形矩阵化简就只能通过看来化简吗?
...行行列变换,在数值计算中,还经常用到正交型的变换与三角形的变换。1、矩阵的QR分解:Q是一个正交阵,R是上三角矩阵。矩阵的QR分解可以有两种方法。其一是Gram-Schmidt正交化方法。该方法的好处是,不论分解了多少步,都... 查看详情