Scipy - 找到矩阵列空间的基础

时间:2014-11-27 17:47:34

标签: python numpy scipy linear-algebra linear-programming

我正在尝试编写一个简单的Simplex算法,第一步是找到一个基本的可行解决方案:

  1. 选择一组A
  2. 的线性独立列
  3. 将对应于不在B中的列的x的所有组件设置为零。
  4. 求解m个结果方程以确定x的分量。这些是基本变量。
  5. 我知道解决方案将涉及使用scipy.linalg.svd(或scipy.linalg.lu)和一些numpy.argwhere / numpy.where魔法,但我不确定如何。

    有没有人有纯粹的Numpy / Scipy实现找到基础(步骤1),或者甚至更好,以上所有?

    示例:

    >>> A
    array([[1, 1, 1, 1, 0, 0, 0],
           [1, 0, 0, 0, 1, 0, 0],
           [0, 0, 1, 0, 0, 1, 0],
           [0, 3, 1, 0, 0, 0, 1]])
    
    >>> u, s, v = scipy.linalg.svd(A)
    >>> non_zero, = numpy.where(s > 1e-7)
    >>> rank = len(non_zero)
    >>> rank
    4
    >>> for basis in some_unknown_function(A):
    ...     print(basis)
    {3, 4, 5, 6}
    {1, 4, 5, 6}
    

    等等。

2 个答案:

答案 0 :(得分:7)

A QR decomposition为A:

的列空间提供正交基础
q,r = np.linalg.qr(A)

如果A的排名为n,则n的第一q列构成A列空间的基础。

答案 1 :(得分:3)

尝试使用此

scipy.linalg.orth(A)

这产生了矩阵A的正交基础