python - 在 numpy(和数字格式)中查找小矩阵的零空间的一种简单的类似 matlab 的方法

标签 python matlab numpy matrix linear-algebra

<分区>

必须有一种简单的方法来获得一个小的零空间(比如 3x3) python 的 numpy 或 scipy 中的矩阵。

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的人注定要失败吗? 永远看着这些小数?

提前致谢。

d.

最佳答案

从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()

关于python - 在 numpy(和数字格式)中查找小矩阵的零空间的一种简单的类似 matlab 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19820921/

相关文章:

python - 在简单的 pandas 数据框上使用 tsfresh

python - 使用 pandas 检测具有许多缺失值的数据的异常值

matlab - 用MATLAB写一个二维实现牛顿法的函数

python - 如何根据元组内容拆分 numpy 数组?

python - Django 测试在测试数据库创建上浪费了太多时间

python - WordPress XML 解析错误 : unbound prefix?

matlab - 如何标准化直方图以使每个 bin 的总和为 1?

python - 图像类型 int16 到 uint8 的转换

python - 如何将 pytorch 张量转换为 numpy 数组?

python - 使用 numpy 数组作为另一个数组的第二个维度的索引?