上三角矩阵的矩阵逆计算给出了大矩阵维度的误差

     2023-02-22     144

关键词:

【中文标题】上三角矩阵的矩阵逆计算给出了大矩阵维度的误差【英文标题】: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 = IdentityBottom*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正交化方法。该方法的好处是,不论分解了多少步,都... 查看详情