在numpy中,寻找小矩阵的零空间的一种简单类似matlab的方法(以及数字格式化)。

11

在 Python 的 numpy 或 scipy 库中,获取一个小矩阵(比如 3x3)的零空间应该有很简单的方法。

在这方面,MATLAB 可能会更好。举个例子:

A = [1 2 3; 
     2 3 4; 
     2 4 6]

rank(A) % rank is 2 
null(A, 'r') % ask matlab to be ('r') reasonable about 
             % its choice of a vector in A's nullspace

最后一个命令的输出结果为:

 1 
-2 
 1

看起来 - 这是真的吗? - 在numpy中事情并不是那么简单:

import numpy as np
A = array(([1, 2, 3], [2, 3, 4], [2, 4, 6])) 
np.linalg.matrix_rank(A) # ok, getting the rank of a matrix is this esay, even if
                         # it takes more keystrokes, but how about its null space
从我迄今为止所搜寻到的内容来看,似乎需要先调用svd分解函数才能获取零空间。

在Python中肯定有更简单的方法。

此外,在matlab中可以这样说:

format rat
为了避免在输出矩阵时盯着长长的小数分数不放。(例如,当格式设置为“rational”时,输出矩阵中的一个条目将看起来像1/2而不是难看的0.5000000)Python是否有类似的功能,或者使用Python的任何人都注定要永远看这些小数吗?提前致谢。

http://wiki.scipy.org/Cookbook/RankNullspace - Warren Weckesser
2
使用 np.set_printoptions(precision=2) 将浮点输出的精度设置为 2 位数字。输入 help(np.set_printoptions) 查看其他选项。 - unutbu
1个回答

15

从null.m的Matlab代码可以看出,他们还调用了svd来获取零空间。实际上,他们还通过调用svd来获取秩(我没有复制在这里,但是请随意阅读代码,它大约有4行)。

function Z = null(A,how)
   % clip
   [~,S,V] = svd(A,0);
   if m > 1, s = diag(S);
      elseif m == 1, s = S(1);
      else s = 0;
   end
   tol = max(m,n) * max(s) * eps(class(A));
   r = sum(s > tol);
   Z = V(:,r+1:n);
end

这里是一个 Python 版本的函数,用于计算一个方阵的秩和零空间。它返回该矩阵的秩以及一个形状为 (N, N - R) 的数组,其中 N 是矩阵的大小,R 是秩。

import numpy as np

def null(a, rtol=1e-5):
    u, s, v = np.linalg.svd(a)
    rank = (s > rtol*s[0]).sum()
    return rank, v[rank:].T.copy()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接