如何在斐波那契数列上使用2D数组相乘矩阵?

时间:2019-04-09 17:07:03

标签: c++ fibonacci

我遇到的问题是我不确定如何将一遍又一遍的矩阵乘以相同的矩阵。我想要实现的是我希望能够更新矩阵。这是我的代码:

int fib3(int a, int b, int n) {
int num[2][2] = { {0,1}, {1,1} };
const int num2[2][2] = { {0,1}, {1,1} };
int factArray[2][1] = { {0}, {1} };
if (n == 0) {
    return a;
}
else if (n == 1) {
    return b;
}
else {

    for (int i = 0; i <= n; i++) {
        num[0][0] = ((num2[0][0] * 0) + num2[0][1] * 1);
        num[0][1] = ((num2[0][0] * 1) + num2[0][1] * 1);
        num[1][0] = ((num2[1][0] * 0) + num2[1][1] * 1);
        num[1][1] = ((num2[1][0] * 1) + num2[1][1] * 1);
    }


    factArray[0][0] = ((num[0][0] * factArray[0][0]) + num[0][1] * factArray[1][0]);
    factArray[1][0] = ((num[1][0] * factArray[0][0]) + num[1][1] * factArray[1][0]);

    return factArray[0][0];
}

在这里,我将以前的矩阵乘以一个常数矩阵,但是我不确定如何像我一样更新矩阵。

因此矩阵被提高到一定的幂。

因此,例如,我想找到第五个斐波那契数列的f(5),该序列应为5,并且在编程中得到1。

1 个答案:

答案 0 :(得分:1)

矩阵表示中的公式主要用于理论分析。诀窍在于,向量中可以始终包含序列的两个元素,而不必引用序列的较早元素。但是,要实现它,与使用递归公式相比,我看不出有什么好处。考虑一下

 | 1 1 |   | a |    | a+b |
 | 1 0 | * | b | =  | a   |

因此,矩阵乘法的作用完全相同:添加最后两个元素,记住当前元素(a)。

话虽如此,您的代码有一些问题:

  • 您传递了ab,但是您只能将它们用于序列的第一个和第二个元素。您不需要ab。初始值已经在矩阵的初始值中。
  • 您有一个循环,但是在每次迭代中,您都计算相同的值并将它们写入相同的数组元素中。
  • 我不能真正遵循您代码的逻辑。为什么循环后还有另一个乘法?简而言之,matrix formula说:“取一些起始向量,将矩阵n应用一次,完成”。老实说,我无法在您的代码中找到任何内容;)

如果您坚持使用矩阵乘法,建议不要使用c样式的数组。他们不喜欢被人流传。请改用std::array。我对嵌套略有厌恶,因此建议使用

constexpr size_t N = 2;
using matrix = std::array<int,N*N>;
using vector = std::array<int,N>;

std::array可以轻松返回:

vector multiply(const matrix& a,const vector& b) {
    vector result;
    auto ma = [&a](size_t row,size_t col) { return a[row*N+col];};    
    result[0] = ma(0,0)*b[0] + ma(0,1)*b[1];
    result[1] = ma(1,0)*b[0] + ma(1,1)*b[1];
    return result;
}

现在,实现斐波那契序列应该很简单。

Spoiler Alert