数据结构重读 – 矩阵乘法

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

Leave a Reply

Your email address will not be published.