如何检测非方形矩阵的所有行是否在python中是正交的

ele*_*ora 6 python math numpy scipy

我可以使用np.linalg.matrix_rank(A)测试矩阵的等级.但是如何测试A的所有行是否正确有效?

我可以采取所有行对并计算它们之间的内在产品,但有更好的方法吗?

我的矩阵的行数少于列数,行数不是单位向量.

shx*_*hx2 5

这个答案基本上总结了问题和评论中提到的方法,并添加了一些关于它们的比较/见解


方法#1 - 检查所有行对

正如您所建议的那样,您可以遍历所有行对,并计算内部产品.如果A.shape==(N,M),即每行有N行大小为M,则最终会出现O(M*N ^ 2)复杂度.

方法#2 - 矩阵乘法

正如@JoeKington在评论中所建议的那样,你可以计算乘法A.dot(A.T),并检查所有非对角元素.根据用于矩阵乘法的算法,这可能比天真的O(M*N ^ 2)算法更快,但只是渐近更好.除非你的矩阵很大,否则它们会变慢.


方法#1的优点:

  • 你可以"短路" - 一找到第一个非正交对就退出检查
  • 需要更少的内存.在#2中,您创建一个临时NxN矩阵.

方法#2的优点:

  • 乘法很快,因为它是在经过大量优化的线性代数库(ATLAS的BLAS)中实现的.我相信那些库根据输入大小选择合适的算法(即它们不会在小矩阵上使用花哨算法,因为它们对于小矩阵来说速度较慢.在O-notation背后隐藏着一个很大的常数).
  • 写的代码少

我敢打赌,对于小矩阵,方法#2将证明更快,因为LA库被大量优化,并且尽管他们计算整个乘法,即使在处理第一对非正交行之后也是如此.

  • 有第三种方法,计算A ^ T的QR分解.如果行是正交的,则R因子将是对角线.它可能比计算A*A ^ T在数值上更稳定,计算工作量基本相同. (4认同)

ele*_*ora 5

看来这样做了

product = np.dot(A,A.T)
np.fill_diagonal(product,0)
if (product.any() == 0):
Run Code Online (Sandbox Code Playgroud)

  • 你的最后一行似乎没了.你是说`if(product!= 0).any():引发异常("不正交")`?我也不会检查确切的相等性,而是像`if(np.abs(product)> tol).any():raise ...` (3认同)