矩阵乘法最naive的版本,自己数学弱爆了,矩阵乘法已经不知道怎么算了……
先科普下吧。
3 0 0 5
(A) 0 -1 0 0
2 0 0 0
乘
0 2
(B) 1 0
-2 4
0 0
首先乘出来的结果是,新矩阵的行是A的行,新矩阵的列是B的列。
计算方法是,首先A的第1行点乘(每个位置上分别乘)B第1列的元素,做为结果矩阵(1, 1)上的元素。然后A的第1行点乘第2列,做为结果矩阵(1, 2)。。。依次类推。
算法如下:
#include <stdio.h>
#include <string.h>
#define MAX 100
struct Matrix
{
int data[MAX][MAX];
int row, col;
};
void matrix_init(struct Matrix* matrix, int row, int col)
{
matrix->row = row;
matrix->col = col;
memset(matrix->data, 0, sizeof(int)*MAX*MAX);
}
void matrix_print(struct Matrix* matrix)
{
int i,j;
for(i=1;i<=matrix->row;i++)
{
for(j=1;j<=matrix->col;j++)
{
printf("%3d ", matrix->data[i][j]);
}
printf("\n");
}
printf("\n");
}
// Multiply matrix a * b => c
void matrix_mult(struct Matrix* a, struct Matrix* b, struct Matrix* c)
{
int i,j,k;
// C's row is a's row, C's col is b's col
matrix_init(c, a->row, b->col);
for(i=1;i<=a->row;i++)
{
for(j=1;j<=b->col;j++)
{
c->data[i][j] = 0;
for(k=1;k<=a->col;k++)
{
c->data[i][j] += a->data[i][k] * b->data[k][j];
}
}
}
}
int main()
{
struct Matrix m, n, r;
// Set matrix m
matrix_init(&m, 3, 4);
m.data[1][1] = 3;
m.data[1][4] = 5;
m.data[2][2] = -1;
m.data[3][1] = 2;
// Set matrix n
matrix_init(&n, 4, 2);
n.data[1][2] = 2;
n.data[2][1] = 1;
n.data[3][1] = -2;
n.data[3][2] = 4;
// Multi m*n => r
matrix_mult(&m, &n, &r);
// Print
matrix_print(&m);
matrix_print(&n);
matrix_print(&r);
return 0;
}