我已经尝试过多次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/