c语言循环后矩阵乘法错误
matrix multiplication error after loop in c language
我有一个任务,我必须使矩阵乘法程序更高效
所以我写了一个叫做乘法矩阵的方法,但是在我实际在循环中进行矩阵乘法之后,最终乘积矩阵全为零但是,如果我在循环中检查 while 它不为零
int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
if(n1 != m2) {
printf("error\n");
return NULL;
}
int i = 0;
int j = 0;
int k = 0;
int** product = (int**) malloc(m1 * sizeof(int*));
for(i = 0; i<m1; i++){
product[i] = (int*) malloc(n2 * sizeof(int));
for(j = 0; j<n1; j++){
product[i][j] = 0;
}
}
*
for(i = 0; i < m1; i ++) {
product[i] = (int*) malloc(n2 * sizeof(int));
int chg = 0;
while(j<n2){
if(k == n1 ){
//chg = 0;
k = 0;
//printf("%d\n", j);
j++;
}
product[i][j] += matrix1[i][k] * matrix2[k][j];
printf("%d \n", product[i][j]);
k++;
chg = 1;
}
}
return product;
}
我发现了两个错误:
您没有在外部乘法循环中重置 j = 0
。这导致它只完成一行,如果它完全进入内部循环,因为它的值在分配循环之后仍然等于 n1
。这很可能就是它为您返回全零的原因。
其次,你也应该在外循环中重置k。当条件 j<n2
被打破时,i
递增,但 k
保持与上一个循环结束时相同的值。
我也不知道 chg 变量的作用是什么,因为它什么都不做。
而且,正如 TrustworthySystems 所说,只分配一次内存,否则就会发生泄漏。这是正确的函数:
int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
if(n1 != m2) {
printf("error\n");
return NULL;
}
int i = 0;
int j = 0;
int k = 0;
int** product = (int**) malloc(m1 * sizeof(int*));
for(i = 0; i<m1; i++){
product[i] = (int*) malloc(n2 * sizeof(int));
for(j = 0; j<n1; j++){
product[i][j] = 0;
}
}
for(i = 0; i < m1; i++) {
int chg = 0;
j = 0;
k = 0;
while(j<n2){
if(k == n1 ){
k = 0;
j++;
}
product[i][j] += matrix1[i][k] * matrix2[k][j];
k++;
chg = 1;
}
}
return product;
}
我有一个任务,我必须使矩阵乘法程序更高效 所以我写了一个叫做乘法矩阵的方法,但是在我实际在循环中进行矩阵乘法之后,最终乘积矩阵全为零但是,如果我在循环中检查 while 它不为零
int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
if(n1 != m2) {
printf("error\n");
return NULL;
}
int i = 0;
int j = 0;
int k = 0;
int** product = (int**) malloc(m1 * sizeof(int*));
for(i = 0; i<m1; i++){
product[i] = (int*) malloc(n2 * sizeof(int));
for(j = 0; j<n1; j++){
product[i][j] = 0;
}
}
*
for(i = 0; i < m1; i ++) {
product[i] = (int*) malloc(n2 * sizeof(int));
int chg = 0;
while(j<n2){
if(k == n1 ){
//chg = 0;
k = 0;
//printf("%d\n", j);
j++;
}
product[i][j] += matrix1[i][k] * matrix2[k][j];
printf("%d \n", product[i][j]);
k++;
chg = 1;
}
}
return product;
}
我发现了两个错误:
您没有在外部乘法循环中重置 j = 0
。这导致它只完成一行,如果它完全进入内部循环,因为它的值在分配循环之后仍然等于 n1
。这很可能就是它为您返回全零的原因。
其次,你也应该在外循环中重置k。当条件 j<n2
被打破时,i
递增,但 k
保持与上一个循环结束时相同的值。
我也不知道 chg 变量的作用是什么,因为它什么都不做。
而且,正如 TrustworthySystems 所说,只分配一次内存,否则就会发生泄漏。这是正确的函数:
int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
if(n1 != m2) {
printf("error\n");
return NULL;
}
int i = 0;
int j = 0;
int k = 0;
int** product = (int**) malloc(m1 * sizeof(int*));
for(i = 0; i<m1; i++){
product[i] = (int*) malloc(n2 * sizeof(int));
for(j = 0; j<n1; j++){
product[i][j] = 0;
}
}
for(i = 0; i < m1; i++) {
int chg = 0;
j = 0;
k = 0;
while(j<n2){
if(k == n1 ){
k = 0;
j++;
}
product[i][j] += matrix1[i][k] * matrix2[k][j];
k++;
chg = 1;
}
}
return product;
}