【问题标题】:Python/Matlab - Taking rank of matrix in quad precision or morePython/Matlab - 以四精度或更高精度对矩阵进行排名
【发布时间】:2016-11-26 17:32:56
【问题描述】:

我有一个 14x14 矩阵,我正在尝试对其进行排名。问题是它的条件数很高,所以使用双精度我的矩阵不是满秩的。我知道它应该是,所以我试图以更高的精度获得排名。

到目前为止,我已经在 python 中安装了 bigfloat 包,但试图以更高的精度获得排名没有成功。我还缩放了我的矩阵,我尝试了 python 的 jacobi 预处理器和其他一些缩放方法,但还不够。

我不是要解决线性方程组,我只需要验证我的所有列都是线性独立的。换句话说,我想验证一个(简化的)矩阵,例如所示的矩阵的秩为 2,而不是 1。

[1, 0;
 0, 1e-20]

有什么建议吗?

【问题讨论】:

  • 只是指出“排名”在 python 中的含义与 数学上的含义完全不同。这将有助于用一个例子来说明,这样就不会有混淆。
  • 我使用了 matlab 的 rank 函数和 python 的 np.linalg.matrix_rank() 但它只执行双精度计算。
  • 我找到了适用于 MATLAB 的多精度计算工具箱,它完全符合我的要求。 Python有类似的东西吗?

标签: python matrix precision rank


【解决方案1】:

matlab 的rank 函数对您不起作用吗?

>> A = [1,0; 0, 1e-20];
>> rank(A, 1e-19)
ans =  1
>> rank(A, 1e-21)
ans =  2

【讨论】:

  • 哦,抱歉。我将帖子中的matrix 标记误读为matlab,因此所有的matlab 答案,因为我认为你想要一个“python 或matlab”解决方案...... facepalm。从好的方面来说,如果你乐于使用 oct2py 模块,你可以使用 octave 的 rank 函数(不过,我确信 python 可能有一个原生函数):)
  • 确实我可以改变容差并得到一个好的结果。但是,我认为默认容差是最好的,因为它决定了何时引入数值舍入误差。计算仍以双精度执行,因此,如果您要降低精度,则结果无效,因为它在误差范围内。我可能是错的,但我就是这么想的。
【解决方案2】:

如果您使用病态矩阵,则很难判断矩阵的等级。您示例中的 1.0e-20 可能只是实际计算中的舍入错误。

在 numpy 中,通过查看 SVD 并计算“零”特征值的数量来检查排名,其中“零”具有一定的容差。根据您在此处设置的内容,您会得到不同的结果:

import numpy

a = numpy.array([[1, 0], [0, 1e-20]])

rank = numpy.linalg.matrix_rank(a, tol=1.0e-10)
print(rank)

rank = numpy.linalg.matrix_rank(a, tol=1.0e-30)
print(rank)
1
2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多