我已经尝试过多次Poweing,但从未做到正确。谁能帮我弄清楚我的代码有什么问题吗?我的多是对的。

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

最佳答案

如果您的函数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;
}

关于c - 矩阵乘法与电源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30343893/

10-11 22:58