我用Symphy做了一些手术,偶然发现:

如果我声明以下矩阵并try 得到它的2-范数(最大sing.value):

from sympy import Matrix

Matrix([[4, 1, 0, 0], [1, 4, 1, 0], [0, 1, 4, 1], [0, 0, 1, 4]]) # declare matrix
print(x.norm(2)) # print it's 2-norm

我得到了预期的结果:

sqrt(9*sqrt(5)/2 + 43/2)

但是,当我声明一个看似等价的矩阵并试图得到它的2-范数时,我得到了一个错误:

from sympy import Matrix

x = Matrix([[7, -13, -3, -1, 0], [-2, 4, 2, 0, 0], [5, -9, -2, 0, 1]]) # declare matrix
print(x.norm(2))  # print it's 2-norm

错误:

Traceback (most recent call last):
  File "main.py", line 29, in <module>
    print(x.norm(2))
  File "venv/lib/python3.9/site-packages/sympy/matrices/matrices.py", line 1984, in norm
    return Max(*self.singular_values())
  File "venv/lib/python3.9/site-packages/sympy/functions/elementary/miscellaneous.py", line 391, in __new__
    args = frozenset(cls._new_args_filter(args))
  File "venv/lib/python3.9/site-packages/sympy/functions/elementary/miscellaneous.py", line 564, in _new_args_filter
    raise ValueError("The argument '%s' is not comparable." % arg)
Value错误: The argument 'sqrt(121 + 43127/(3*(1723619 + 2*sqrt(199009527)*I/9)**(1/3)) + (1723619 + 2*sqrt(199009527)*I/9)**(1/3))' is not comparable.

我阅读了源代码,了解到is not comparable意味着一个对象可以计算成实数,或者已经是实数了.我不明白这个矩阵是如何计算成实数的(它是一个矩阵).

有谁能解释为什么我在一个矩阵上出现了这个错误,而在另一个矩阵上却没有?

谢谢

推荐答案

从回溯中可以看出,它试图计算奇异值的最大值:

Max(*self.singular_values())

在您的例子中,您可以通过执行x.singular_values()来可视化奇异值(输出非常长,所以我不打算将其粘贴在这里).

然而,其中一些奇异值是复数,因此无法进行比较.函数Max需要实数!例如,您可以执行:

Max(5 + I, 3)
# ValueError: The argument '5 + I' is not comparable.

编辑:

正如奥斯卡在 comments 中指出的,想象的部分真的很小.因此,我们可以将奇异值转换为数字数据类型,如果虚部低于阈值,则丢弃虚部,然后继续计算公式:

x = Matrix([[7, -13, -3, -1, 0], [-2, 4, 2, 0, 0], [5, -9, -2, 0, 1]]) # declare matrix
sv = [complex(t) for t in x.singular_values()]
# discard imaginary components if they are lower than a threshold
threshold = 1e-08
sv = [t.real if t.imag < threshold else t for t in sv]
max(sv)
# out: 18.99465957621187

Python相关问答推荐

合并其中一个具有重叠范围的两个框架的最佳方法是什么?

自动编码器和极坐标

Python中两个矩阵的自定义Hadamard风格产物

如何将新的SQL服务器功能映射到SQL Alchemy的ORM

如何在Python中使用ijson解析SON期间检索文件位置?

将轨迹优化问题描述为NLP.如何用Gekko解决这个问题?当前面临异常:@错误:最大方程长度错误

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

如果索引不存在,pandas系列将通过索引获取值,并填充值

添加包含中具有任何值的其他列的计数的列

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

通过Selenium从页面获取所有H2元素

为什么符号没有按顺序添加?

C#使用程序从Python中执行Exec文件

如何使用数组的最小条目拆分数组

在vscode上使用Python虚拟环境时((env))

如何在图中标记平均点?

如何从列表框中 Select 而不出错?

Polars asof在下一个可用日期加入

如果包含特定值,则筛选Groupby