【问题标题】:Numpy Matrix inverse with float128 type具有 float128 类型的 Numpy Matrix 逆
【发布时间】:2016-04-12 05:09:58
【问题描述】:

我得到了一个 float128 值的矩阵“x”,并且在以下情况下出现下一个错误:

> q = (inv(xt * x) * xt) * n
> array type float128 is unsupported in linalg

其中xt 是x 和n 其他float128 矩阵的转置。该矩阵的所有其他操作都得到正确处理,如转置或矩阵乘积。

是的,这种情况下我需要 float128,否则结果与我们作为参考的更接近真实值的结果不同。

【问题讨论】:

  • 这个错误消息对我来说似乎很简单:NumPy 中的 float128 支持不完整或一致。
  • @xnx 是的,我需要一个解决方法:p
  • 这听起来有点像XY problem。如果您要根据预期的参考结果测试计算出的浮点结果,那么无论如何您都不能指望完全相等,因此您需要在测试中建立一个容差;再多的额外精度也不会让这种需求消失。 (当然,公差应该是多少是另一个困难且与任务相关的问题。)你确定你需要额外的精度吗?
  • 另一条评论:从您显示的代码来看,您似乎正在解决最小二乘问题。您是否有任何理由不使用现有的 NumPy 和 SciPy 例程进行最小二乘?这些可能比本土版本在数字上更稳健。 (特别是,实际上反转 xt*x 并不是解决最小二乘问题的最有效或最稳定的方法。)
  • 相关:johndcook.com/blog/2010/01/19/dont-invert-that-matrix。直接反转矩阵几乎不是一个好主意。

标签: python python-3.x numpy matrix-inverse


【解决方案1】:

numpy 中没有 float128 数据类型。支持的 numpy 数据类型可以在这里找到:http://docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html

如果您需要解决方法,可以尝试使用 numpy C API http://docs.scipy.org/doc/numpy-1.10.0/reference/c-api.dtype.html 中的 NPY_LONGDOUBLE

【讨论】:

  • 这取决于平台。在 OS X 上,有 numpy.float128 dtype,尽管它没有提供您可能希望的 IEEE 754 binary128 格式。它对应于标准的 80 位 x87 扩展精度类型,具有 6 个字节的填充。 (同样,在 Linux 上通常有一个 numpy.float96 dtype。)
  • 更多信息在这里来自 Nathaniel Smith 的出色回答:stackoverflow.com/a/17023995/270986
  • 这是一篇好文章,它很好地解释了事情。看来我的回答并没有真正回答这个问题,但如果longdouble 是要走的路,可以指出一种回答方法。
  • 我怀疑 OP 已经在使用 np.longdouble。这就是问题的原因!对np.longdouble 类型的支持并没有深入到核心线性代数运算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
相关资源
最近更新 更多