矩阵乘法和幂函数c

时间:2015-05-20 08:11:28

标签: c matrix

我已经尝试了几次电力但从来没有做对。任何人都可以帮我弄清楚我的代码有什么问题吗?我的多才对。

uint32_t* matrix_mul(const uint32_t* matrix_a, const uint32_t* matrix_b) {

 uint32_t* result = new_matrix();

    /*
        to do

        1 2   1 0    1 2
        3 4 x 0 1 => 3 4

        1 2   5 6    19 22
        3 4 x 7 8 => 43 50
    */
    for(ssize_t y=0; y<g_height; y++){
        for(ssize_t x=0; x<g_width; x++){
            for(int i=0; i<g_width; i++)
                result[y*g_width + x]+=matrix_a[y*g_width + i]*matrix_b[i*g_width + x ];
        }
    }
    return result;
}

/**
 * Returns new matrix, powering the matrix to the exponent
 */
uint32_t* matrix_pow(const uint32_t* matrix, uint32_t exponent) {

    uint32_t* result = new_matrix();

    /*
        to do

        1 2        1 0
        3 4 ^ 0 => 0 1

        1 2        1 2
        3 4 ^ 1 => 3 4

        1 2        199 290
        3 4 ^ 4 => 435 634
    */
    uint32_t*tempresult=cloned(matrix);
    if(exponent==0){
        result=identity_matrix();
    }
    else if(exponent==1) {
            result=tempresult;
    } 
    else if(exponent==2){
        for(ssize_t y=0; y<g_height; y++){
            for(ssize_t x=0; x<g_width; x++){
                for(int i=0; i<g_width; i++)
                    result[y*g_width + x]+=matrix[y*g_width + i]*matrix[i*g_width + x ];
            }

        }
    }
else if(exponent>=3){
        for(ssize_t y=0; y<g_height; y++){
            for(ssize_t x=0; x<g_width; x++){
                for(int i=0; i<g_width; i++)
                       result[y*g_width + x]+=matrix[y*g_width + i]*matrix[i*g_width + x ];
            }

        }
        for(int j=1;j<=exponent-2;j++){
            for(ssize_t y=0; y<g_height; y++){
                for(ssize_t x=0; x<g_width; x++){
                    for(int i=0; i<g_width; i++)

                        result[y*g_width + x]+=result[y*g_width + i]*matrix[i*g_width + x ];

    return result;
}

1 个答案:

答案 0 :(得分:1)

如果您的功能matrix_mul是正确的,为什么不在matrix_pow功能中重复使用它?

会有类似的东西:

uint32_t* matrix_pow(const uint32_t* matrix, uint32_t exponent) {

    uint32_t* tempresult=identity_matrix();
    ssize_t i;

    if (exponent == 0) return identity_matrix();
    for (i = 0; i < exponent; i++) tempresult = matrix_mul(tempresult, matrix);

    return tempresult;
}