如何找到属于非方阵零空间的线性独立矢量? (蟒蛇)

时间:2018-10-07 18:15:59

标签: python numpy matrix scipy algebra

我有一个非平方矩阵,还有一种确定矩阵空空间的方法(可从此线程How to find the Null Space of a matrix in Python using numpy? 找到),但是采用此解决方案存在一些问题。

对于一个,我不确定我的值是否正确,因为我不太确定要寻找什么。

第二,我需要从这个空空间中找到两个线性独立的向量,但是我不知道从这里开始要确定的下一步。

最后,我需要确定矩阵的任何列在R3和R4中是否线性独立。

任何帮助将不胜感激。

代码:

import numpy as np
import scipy as sp
from scipy import linalg

a = np.matrix(
[
    [ 3,  2, -1,  4],
    [ 1,  0,  2,  3],
    [-2, -2,  3, -1]
])


def null(A, eps=1e-15):
    u, s, vh = linalg.svd(A)
    null_mask = (s <= eps)
    null_space = sp.compress(null_mask, vh, axis=0)
    return sp.transpose(null_space)

print(null(a))

输出:

 [[ 0.8290113 ]
 [-0.2330726 ]
 [ 0.24969281]
 [-0.44279897]]

我假设由于输出不是空矩阵[],因此该矩阵有一些特殊之处,我只是不知道它的含义。

1 个答案:

答案 0 :(得分:2)

在这种情况下,我建议使用sympy

from sympy import Matrix
a  = Matrix([
    [ 3,  2, -1,  4],
    [ 1,  0,  2,  3],
    [-2, -2,  3, -1]
])
print(a.nullspace())

输出:

[Matrix([
[ -2],
[7/2],
[  1],
[  0]]),
Matrix([
[ -3],
[5/2],
[  0],
[  1]])]

与矩阵a相乘时,通过显式检查结果是否映射为0,可以轻松地检查结果是否确实属于空空间:

n1, n2 = a.nullspace()
print(a*n1, a*n2) 

导致:

Matrix([[0], [0], [0]]) Matrix([[0], [0], [0]])

最后,要在R3中获得矩阵的线性独立列,可以使用函数columnspace,该函数返回跨越矩阵列空间的列向量列表

print(a.columnspace())

产生

[Matrix([
[ 3],
[ 1],
[-2]]), Matrix([
[ 2],
[ 0],
[-2]])]

是矩阵的前两列。