C++ 如何使用斐波那契序列上的2D数组对矩阵进行乘法?

C++ 如何使用斐波那契序列上的2D数组对矩阵进行乘法?,c++,fibonacci,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) {

我遇到的问题是,我不确定如何用相同的矩阵一次又一次地将矩阵相乘。我试图实现的是,我希望能够更新矩阵。这是我的密码:

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];
}
intfib3(inta,intb,intn){
int num[2][2]={{0,1},{1,1};
const int num2[2][2]={{0,1},{1,1};
int-factArray[2][1]={{0},{1};
如果(n==0){
返回a;
}
else如果(n==1){
返回b;
}
否则{

对于(int i=0;i矩阵表示中的公式主要用于理论分析。诀窍在于,向量中始终可以有序列的两个元素,而不必参考序列的早期元素。然而,要实现它,我看不到与使用递归公式相比的好处。第二,使用t

 | 1 1 |   | a |    | a+b |
 | 1 0 | * | b | =  | a   |
因此,矩阵乘法的效果完全相同:将最后两个元素相加,记住当前元素(
a

也就是说,您的代码存在一些问题:

  • 您可以传递
    a
    b
    ,但您只能将它们用于序列的第一个和第二个元素。您不需要
    a
    b
    。初始值已经在矩阵的起始值中
  • 您有一个循环,但在每次迭代中计算相同的值并将它们写入相同的数组元素
  • 我真的无法理解你的代码逻辑。为什么循环之后会有另一个乘法?简单地说,“取一些起始向量,应用一个矩阵
    n
    次,完成”。老实说,我在你的代码中找不到这一点;)
如果您坚持使用矩阵乘法,我建议您远离c样式的数组。它们不喜欢被传递。请改用
std::array
。我对嵌套有点反感,因此建议使用

constexpr size_t N = 2;
using matrix = std::array<int,N*N>;
using vector = std::array<int,N>;
现在应该直接实现斐波那契序列了


请删除图像链接并将代码张贴在此处。请将过去的代码张贴在此处!我已更新了post@user4630535818问题是,我不知道如何将2x2矩阵提升到某个幂次。我知道的代码中的问题是,我正在重新分配2d数组的值,这是有问题的。@kingw3我希望它这样做比斐波那契序列的递归函数定义要快。我想要一个矩阵的迭代函数实现。
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;
}