矩阵乘法最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; }