В matMult()
все пределы цикла должны быть 5, так как вы умножаете матрицы 5x5. Кроме того, используйте идиоматический for (i = 0; i < dimension; i++)
вместо for (i = 0; i <= dimension_minus_one; i++)
.
Вывод, который я получаю из программы ниже:
Matrix A:
1, 2, 3, 4, 6
6, 1, 5, 3, 8
2, 6, 4, 9, 9
1, 3, 8, 3, 4
5, 7, 8, 2, 5
Matrix B:
3, 5, 0, 8, 7
2, 2, 4, 8, 3
0, 2, 5, 1, 2
1, 4, 0, 5, 1
3, 4, 8, 2, 3
Matrix C:
29, 55, 71, 59, 41
47, 86, 93, 92, 82
54, 102, 116, 131, 76
24, 55, 84, 63, 47
46, 83, 108, 124, 89
Я использовал следующий код:
#include <stdio.h>
static int matmul(size_t ax, size_t ay, int a[ax][ay],
size_t bx, size_t by, int b[bx][by],
size_t cx, size_t cy, int c[cx][cy])
{
if (ay != bx || ax != cx || by != cy)
return(-1); /* Non-compatible matrices */
size_t i, j, k;
/* Zero result */
for (i = 0; i < cx; i++)
{
for (j = 0; j < cy; j++)
c[i][j] = 0;
}
/* Compute result - no care about overflows */
for (i = 0; i < ax; i++)
{
for (j = 0; j < by; j++)
{
for (k = 0; k < ay; k++)
c[i][j] += a[i][k] * b[k][j];
}
}
return(0);
}
static void matminmax(size_t ax, size_t ay, int a[ax][ay],
int *pmin, int *pmax)
{
size_t i, j;
int max = a[0][0];
int min = a[0][0];
for (i = 0; i < ax; i++)
{
for (j = 0; j < ay; j++)
{
if (a[i][j] > max)
max = a[i][j];
else if (a[i][j] < min)
min = a[i][j];
}
}
*pmin = min;
*pmax = max;
}
static void set_printformat(const char *pfx, const char *sfx,
size_t ax, size_t ay, int a[ax][ay],
char *buffer, size_t buflen)
{
int min, max;
matminmax(ax, ay, a, &min, &max);
int len1 = snprintf(0, 0, "%d", min);
int len2 = snprintf(0, 0, "%d", max);
if (len2 > len1)
len1 = len2;
snprintf(buffer, buflen, "%s%d%s", pfx, len1, sfx);
}
static void matprt(size_t ax, size_t ay, int a[ax][ay], const char *tag)
{
size_t i, j;
char format[32];
set_printformat("%s%", "d", ax, ay, a, format, sizeof(format));
printf("%s:\n", tag);
for (i = 0; i < ax; i++)
{
const char *pad = " ";
for (j = 0; j < ay; j++)
{
printf(format, pad, a[i][j]);
pad = ", ";
}
putchar('\n');
}
}
int main(void)
{
int a[5][5] =
{
{ 1, 2, 3, 4, 6 },
{ 6, 1, 5, 3, 8 },
{ 2, 6, 4, 9, 9 },
{ 1, 3, 8, 3, 4 },
{ 5, 7, 8, 2, 5 },
};
int b[5][5] =
{
{ 3, 5, 0, 8, 7 },
{ 2, 2, 4, 8, 3 },
{ 0, 2, 5, 1, 2 },
{ 1, 4, 0, 5, 1 },
{ 3, 4, 8, 2, 3 },
};
int c[5][5];
matprt(5, 5, a, "Matrix A");
matprt(5, 5, b, "Matrix B");
matmul(5, 5, a, 5, 5, b, 5, 5, c);
matprt(5, 5, c, "Matrix C");
return(0);
}
Если кто-то захочет объяснить, как указать, что две входные матрицы для matmul()
постоянны, а третья нет, я был бы признателен.
Обратите внимание, что я проигнорировал возможность возврата ошибки из matmul()
.