为什么我的C程序应该输出一个n的幂的矩阵,却输出我的2^n的幂的矩阵?
我的代码应该接受一个矩阵M,并将其提升为整数a的幂。然而,不知为什么,我的输出总是M^(2^a)。例如,如果我想找到一个3次方的矩阵,我会得到它的8次方为什么我的C程序应该输出一个n的幂的矩阵,却输出我的2^n的幂的矩阵?,c,linux,unix,matrix,matrix-multiplication,C,Linux,Unix,Matrix,Matrix Multiplication,我的代码应该接受一个矩阵M,并将其提升为整数a的幂。然而,不知为什么,我的输出总是M^(2^a)。例如,如果我想找到一个3次方的矩阵,我会得到它的8次方 #include <stdio.h> #include <stdlib.h> #include <math.h> void multiply(int ** p, int pwr, int dim, int ** prod) { int m, i, j, k; /*if (n<pw
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void multiply(int ** p, int pwr, int dim, int ** prod) {
int m, i, j, k;
/*if (n<pwr){*/
int pos = 0;
for (m = 0; m < pwr; m++) {
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j++) {
for (k = 0; k < dim; k++) {
pos += p[i][k] * p[k][j];
}
prod[i][j] = pos;
pos = 0;
}
}
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j++) {
p[i][j] = prod[i][j];
prod[i][j] = 0;
}
}
}
/*n=n+1;
multiply(prod, q, pwr, dim, prod);
}*/
}
int main(int argc, char * argv[]) {
FILE * fp = fopen(argv[1], "r");
int dim, pwr, i, j;
fscanf(fp, "%d", & dim);
int ** matrix;
matrix = (int ** ) malloc(dim * sizeof(int * ));
for (i = 0; i < dim; i++) {
matrix[i] = (int * ) malloc(dim * sizeof(int));
}
int ** prod;
prod = (int ** ) malloc(dim * sizeof(int * ));
for (i = 0; i < dim; i++) {
prod[i] = (int * ) malloc(dim * sizeof(int));
}
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j++) {
fscanf(fp, "%d", & matrix[i][j]);
}
}
fscanf(fp, "%d", & pwr);
if (pwr == 1) {
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
} else if (pwr >= 2) {
multiply(matrix, pwr, dim, prod);
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
return 0;
}
#包括
#包括
#包括
无效乘法(整数**p、整数pwr、整数dim、整数**prod){
int m,i,j,k;
/*如果(n=2){
乘法(矩阵、pwr、dim、prod);
对于(i=0;i
将矩阵自身相乘,然后将结果存储在原始矩阵中。然后你再做一次
非常正常,它可以通8次电。您需要的是另一个临时矩阵,在该矩阵上存储结果,并保留原始矩阵以与结果相乘 为了调试它(对于初学者来说),写几个print语句并找出流程中发生了什么-程序如何进行+正确缩进。我创建了一个临时矩阵,在for循环开始之前将其设置为p,并将所有内容存储在原始矩阵中。我仍然有点困惑
p
是您的原始矩阵。在第一次迭代之后,内部pi不是
p,而是
p**2。等等您可以在p
中看到您正在复制产品,是否?