c - c语言循环后矩阵乘法错误
问题描述
我有一个任务,我必须使矩阵乘法程序更有效,所以我编写了一个称为乘法矩阵的方法,但是在我实际在循环中进行矩阵乘法之后,最终乘积矩阵全为零但是,如果我在循环中检查它不为零
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;
}
推荐阅读
- arrays - 如何为状态数组中的每个值创建新状态
- javascript - 为什么背景滤镜:模糊(5px)破坏了我的设计?
- azure - 如何通过 ARM 模板在 Azure 存储帐户上添加加密 AKV
- python - dask - 合并/完整的笛卡尔积 - 内存问题
- postgresql - Homegraph 概念数据库架构权限
- python - 从 .osm 文件创建 Folium 地图
- python - 为什么我在 Python 中的 string.split 返回不需要的值?
- angular - 如何用角度阅读用户谷歌电子表格
- android - 加速蓝牙经典发现
- linux - 如何解压`.tgz`目录,并将提取的文件之一压缩到内存中?