这个C代码中的函数multiplyTwoMatrices()使用矩阵乘法找到fibonacci有什么问题?

时间:2018-05-31 20:47:22

标签: 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()似乎仅在使用“working alternative”(在此函数内的注释中关闭的代码)而不是当前使用的函数时才起作用。我无法理解这段代码出了什么问题。感谢一点帮助。

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

输出结束:0 0 1 1 1 1 1 1 ...

1 个答案:

答案 0 :(得分:2)

当你的乘法函数是正确的时,当目的地是其中一个操作数时,它不能正常工作;如果是,则在计算正在进行时更改操作数。

要求user_name = ...不同于multipliedMatrixmatrixA(首选),或者在那里有一个临时矩阵并将其复制到结果中!< / p>

P.S。将矩阵类包装到结构中会更容易:

matrixB

这会在调用函数时产生隐式副本;而不是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;
}