c - 这段使用矩阵乘法求斐波那契数的 C 代码中的函数multiplyTwoMatrices() 有什么问题吗?

标签 c matrix-multiplication fibonacci

#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()似乎只有在使用“工作替代方案”(在此函数内的注释中封闭的代码)而不是当前使用的情况下才有效。我无法理解这段代码出了什么问题。感谢您的一点帮助。

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

输出:0 0 1 1 1 1 1 1 ...

最佳答案

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

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


附注将矩阵类包装到结构中会更容易:

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);

关于c - 这段使用矩阵乘法求斐波那契数的 C 代码中的函数multiplyTwoMatrices() 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50632538/

相关文章:

c - C中fork的理解

c++ - C/C++ 中的链式赋值是未定义的行为吗?

python - 处理 Pandas 数据框

Matlab矩阵乘法和转置精度

c++ - 皮萨诺周期的快速计算

scala - 在 Scala 中生成斐波那契数列

创建、传递、返回结构数组并在 C 中循环遍历 int

c++ - C 风格字符串、指针、数组

c++ - 使用矢量化 C++ 的矩阵乘法

c++ - 斐波那契数列的时间复杂度