此 C 代码中用于使用矩阵乘法查找斐波那契的函数 multiplyTwoMatrices() 有什么问题?

What's wrong with the function multiplyTwoMatrices() in this C code for finding fibonacci using matrix multiplication?

#include<stdio.h>

void multiplyTwoMatrices(int (*)[2], int[][2], int[][2]);
void copyMatrix(int[][2], int[][2]);
void powerAMatrix(int[][2], int[][2], int);

int main()
{
    int num;
    scanf("%d", &num);

    int i;
    for(i = -1; i <= num; i++)
    {
        printf("\n%d", fib(i));
    }
}

int fib(int num)
{
    if(num <= 0)
    {
        return 0;
    }
    else
    {
        int matrix[2][2] = {{1, 1}, {1, 0}};
        //int fibMatrix[2][2] = powerAMatrix(matrix[2][2], num);
        int fibMatrix[2][2];
        powerAMatrix(fibMatrix, matrix, num);
        return getFibNum(fibMatrix);
    }
}

void powerAMatrix(int fibMatrix[2][2], int matrix[2][2], int num)
{
    //fibMatrix = matrix;
    copyMatrix(fibMatrix, matrix);
    int i = 0;
    for(i = 1; i < num; i++)
    {
        //fibMatrix = fibMatrix * matrix;
        multiplyTwoMatrices(fibMatrix, fibMatrix, matrix);
    }
}

void copyMatrix(int destinationMatrix[2][2], int sourceMatrix[2][2])
{
    int i = 0; int j = 0;
    for(i = 0; i < 2; i++)
        for(j = 0; j < 2; j++)
            destinationMatrix[i][j] = sourceMatrix[i][j];
}

void multiplyTwoMatrices(int multipliedMatrix[2][2], int matrixA[2][2], int matrixB[2][2])
{

    int i = 0; int j = 0; int k = 0;
    for(i = 0; i < 2; i++)
    {
        for(j = 0; j < 2; j++)
        {
            multipliedMatrix[i][j] = 0;     //or just initialize it as a zero matrix.
            for(k = 0; k < 2; k++)
            {
                multipliedMatrix[i][j] += (matrixA[i][k] * matrixB[k][j]);
            }
        }
    }
                    //working alternative
    /*
    int x =  matrixA[0][0]*matrixB[0][0] + matrixA[0][1]*matrixB[1][0];
    int y =  matrixA[0][0]*matrixB[0][1] + matrixA[0][1]*matrixB[1][1];
    int z =  matrixA[1][0]*matrixB[0][0] + matrixA[1][1]*matrixB[1][0];
    int w =  matrixA[1][0]*matrixB[0][1] + matrixA[1][1]*matrixB[1][1];

    multipliedMatrix[0][0] = x;
    multipliedMatrix[0][1] = y;
    multipliedMatrix[1][0] = z;
    multipliedMatrix[1][1] = w;
    */
}

int getFibNum(int fibMatrix[2][2])
{
    return fibMatrix[0][1];
}

函数 multiplyTwoMatrices() 似乎只有在使用 "working alternative"(代码在该函数的注释中关闭)而不是当前使用的函数时才有效。我无法理解这段代码出了什么问题。感谢您提供一点帮助。

预期输出:0 0 1 1 2 3 5 8 ...

输出即将到来:0 0 1 1 1 1 1 1 ...

虽然您的乘法函数是正确的,但当目标是操作数之一时,它无法正常工作;如果是,则在计算进行时在那里更改操作数。

要么要求 multipliedMatrix 不同于 matrixAmatrixB(这是首选),要么在那里有一个临时矩阵并将其复制到结果中!


P.S。将矩阵 class 包装到结构中会容易得多:

struct intmatrix2x2 {
    int values[2][2];
};

这会在调用函数时进行隐式复制;而不是 copyMatrix 你可以说:

struct intmatrix2x2 b = a;

你的乘法可以读作

struct intmatrix2x2 multiply(struct intmatrix2x2 a, struct intmatrix2x2 b)
{
    struct intmatrix2x2 result;
    int i = 0; int j = 0; int k = 0;
    for(i = 0; i < 2; i++)
    {
        for(j = 0; j < 2; j++)
        {
            result.values[i][j] = 0;     //or just initialize it as a zero matrix.
            for(k = 0; k < 2; k++)
            {
                result.values[i][j] += a.values[i][k] * b.values[k][j]);
            }
        }
    }
    return result;
}

您可以将其用作

struct intmatrix2x2 result = multiply(a, b);