用scipy计算矩阵秩

2024-04-26 12:59:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用scipy计算矩阵的mathematical rank。最明显的函数numpy.rank计算数组的维数(即标量有维数0、向量1、矩阵2等)。我知道numpy.linalg.lstsq模块具有此功能,但我想知道是否在矩阵类的某个地方构建了这样一个基本操作。

下面是一个明确的例子:

from numpy import matrix, rank
A = matrix([[1,3,7],[2,8,3],[7,8,1]])
print rank(A)

这给了2维度,我在这里寻找3的答案。


Tags: 模块函数功能numpy矩阵scipy数组向量
3条回答

为需要在实践中完成此任务的人提供一个粗略的代码片段。随时改进。

u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)

如果numpy不提供排名工具,为什么不自己写呢?

一种有效的计算秩的方法是通过奇异值分解-矩阵的秩等于非零奇异值的个数。

def rank(A, eps=1e-12):
    u, s, vh = numpy.linalg.svd(A)
    return len([x for x in s if abs(x) > eps])

注意eps依赖于您的应用程序-大多数人都同意1e-12对应于零,但您可能会看到即使eps=1e-9也存在数值不稳定性。

用你的例子,答案是三个。如果将第二行更改为[2, 6, 14](与第一行线性相关),则答案是两个(“零”特征值是4.9960E-16)

Numpy提供了numpy.linalg.matrix_rank()

>>> import numpy
>>> numpy.__version__
'1.5.1'
>>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]])
>>> numpy.linalg.matrix_rank(A)
3

相关问题 更多 >