我试图写一个函数,对两个相邻的以行为主的数组执行简单的矩阵乘法。但是当我试图在末尾打印每个值时,我得到了垃圾。我猜这是因为我混淆了正确的迭代和跳转行/列所需的缩放。有人有什么建议吗?
完整的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
void dmatmul(double *a, double *b, double *c, int astride, int bstride, int cdim_0, int cdim_1) {
int i, j, p;
for (i = 0; i < cdim_0; i++) {
for (j = 0; j < cdim_1; j++) {
c[i * cdim_1 + j] = 0.0;
for (p = 0; p < (astride); p++) {
c[i * cdim_1 + j] += a[i * (astride) + p] * b[p * (bstride) + j];
}
}
}
}
int main(void) {
double *x, *y, *z;
int xdim_0, xdim_1, ydim_0, ydim_1, zdim_0, zdim_1, i, j;
xdim_0 = 2;
xdim_1 = 4;
ydim_0 = 4;
ydim_1 = 2;
zdim_0 = 2;
zdim_1 = 2;
x = (double *) malloc (xdim_0 * xdim_1 * sizeof(double));
y = (double *) malloc (ydim_0 * ydim_1 * sizeof(double));
z = (double *) malloc (zdim_0 * zdim_1 * sizeof(double));
for (i = 0; i < xdim_0 * xdim_1; i++) {
x[i] = i + 1;
y[i] = 2 * (i + 1);
}
dmatmul(x, y, z, xdim_1, ydim_1, zdim_0, zdim_1);
printf("\nMatrix product of X and Y dimensions: (%d, %d)\n", zdim_0, zdim_1);
printf("Matrix product of X and Y values:");
for (i = 0; i < zdim_0; i++) {
printf("\n");
for (j = 0; j < zdim_1; i++) {
printf("\t%f", z[i * zdim_1 + j]);
}
}
return 0;
}
1条答案
按热度按时间3qpi33ja1#
主要问题是打印内部
for
循环中的一个拼写错误。但您需要递增
j
,而不是i
:下面是我的代码,它有一个独立的矩阵打印函数,适用于您正在使用的数组:
我也已经初始化了变量,代码应该检查内存是否被分配了,但是没有。
当我在没有打印的情况下运行这段代码时,我得到了正确的结果,所以我仔细看了一下,发现了问题。