我可以使用np.linalg.matrix_rank(A)测试矩阵的等级。但是,我如何测试A的所有行是否有效正交?
我可以获取所有行对并计算它们之间的内部产品但是有更好的方法吗?
我的矩阵的行数少于列数,行数不是单位向量。
答案 0 :(得分:5)
这个答案基本上总结了问题和评论中提到的方法,并添加了一些关于它们的比较/见解
方法#1 - 检查所有行对
正如您所建议的那样,您可以迭代所有行对,并计算内部产品。如果A.shape==(N,M)
,即每行有N行大小为M,则最终会产生O(M * N ^ 2)复杂度。
方法#2 - 矩阵乘法
正如@JoeKington的评论中所建议的那样,您可以计算乘法A.dot(A.T)
,并检查所有非对角线元素。根据用于矩阵乘法的算法,这可能比天真的O(M * N ^ 2)算法faster,但只是渐近更好。除非你的矩阵很大,否则它们会变慢。
方法#1的优点:
方法#2的优点:
我敢打赌,对于小矩阵,方法#2会因为LA库被大量优化而被证明更快,尽管事实上他们计算整个乘法,即使在处理了第一对非正交行之后也是如此。
答案 1 :(得分:5)
似乎这样做
product = np.dot(A,A.T)
np.fill_diagonal(product,0)
if (product.any() == 0):
答案 2 :(得分:2)
通常,为了找到某个矩阵X的距离空间的正交基,可以计算该矩阵的QR分解(使用Givens旋转或Householder反射器)。 Q是正交矩阵,R是上三角形。对应于R的非零对角线条目的Q列形成范围空间的标准正交基础。
如果X = A T 的列,即A的行已经是正交的,那么QR分解必然具有R因子对角线,其中对角线条目是正或负X列的长度和长度。 A行。
普通的民间传说认为,这种方法在数值上比产品A * A T = R T * R的计算更好。这可能只对更大的矩阵有用。计算并不像矩阵乘积那样简单,但操作量大小相同。
答案 3 :(得分:0)
(U.T @ U == np.eye(U.shape[0])).all()
如果矩阵“ U”是正交的,则将给出“ True”,否则为“ False”,这里的“ all()”函数用于转换在“ UT @”之后得到的布尔值(真/假值)矩阵U == np.eye(U.shape [0])',转换为单个布尔值。
如果要检查矩阵是否近似正交(我的意思是,我们在'U.T @ U'之后得到的矩阵几乎等于一个单位矩阵), 然后像这样使用'np.allclose()'
np.allclose(U.T @ U, np.eye(U.shape[0]))
注意:“ @”用于矩阵乘法