【问题标题】:Problems with matrix multiplication - some negative results矩阵乘法的问题 - 一些负面结果
【发布时间】:2020-11-14 18:21:28
【问题描述】:

我尝试使用矩阵乘法来找到斐波那契数。但我有负面结果的问题。

import numpy as np

a = np.array([[1, 1],[1, 0]])
b = np.array([[1, 1],[1, 0]])
for i in range(100):
    if b[0][0] < 0:
        print(i)
    b = np.matmul(b, a)
#output: 91, 93, 94, 95, 97

是我的数学太差,无法理解负面结果,还是我必须在 python / numpy 中考虑什么?

【问题讨论】:

  • 起初我对@clarked 的解决方案很满意,但后来我决定编写自己的矩阵乘法函数。由于python整数类型,我不限于2 ** 64以下的值。如果有人想看我的脏代码,请告诉我,但我已经警告过你了!我没有数学博士学位,所以我不太了解如何优化该代码

标签: python numpy matrix fibonacci


【解决方案1】:

你的数学是正确的。您遇到了int64 类型大小的限制。 int64 最大可以是(2**63) - 1。您的矩阵是int64 类型,您可以使用a.dtype 进行检查。

如果您在第一次否定之前查看迭代 i=90,您会得到

[[7540113804746346429, 4660046610375530309],
 [4660046610375530309, 2880067194370816120]]

但是7540113804746346429 之后的下一个斐波那契数是12200160415121876738 = 7540113804746346429 + 4660046610375530309,它大于2**63 - 1。所以它不能表示为int64 类型。这会导致溢出,您可以阅读有关 here 的更多信息,但这就是您得到否定的原因。

浮点数可以表示的数字范围要大得多。如果您使用浮点数而不是整数,您将避免负数。有很多方法可以做到这一点,但最简单的方法是修改 ab 的初始矩阵定义以包含如下小数:

a = np.array([[1., 1.],[1., 0.]])                              
b = np.array([[1., 1.],[1., 0.]])

然后你会注意到你所有的迭代都会有正数。浮点数可能有其自身的错误来源,因为并非每个数字都可以准确表示,因此您必须根据自己的情况更好地决定您想要什么。


旁注:您可以使用b @ np.linalg.matrix_power(a, n),而不是使用for循环来获得第n次迭代(代码中的100),这相当于将a自身乘以n次,然后乘以@987654340 @ 或 B @ A^n。 NumPy 对其进行了优化,因此效率更高。

【讨论】:

  • 非常感谢您对优化的建议。代码尚未优化。我会这样做example for Swift
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多