矩阵乘法

题目 矩阵乘法  
描述
设矩阵int a[4][3],矩阵int b[3][5]。矩阵的数据由用户输入。输出新的矩阵c=a*b. 输出格式: 
c00 c01 c02 c03 c04 
c10 c11 c12 c13 c14 
c20 c21 c22 c23 c24 
c30 c31 c32 c33 c34 

矩阵乘法的计算方法: 
对于矩阵A[m][q]*B[q][n], 
相乘的结果为矩阵C[m][n]且对于矩阵C中每一项都有 
C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + ..... + A[i][q]*B[q][j] 

注意:实际矩阵大小不一定是4*3和3*5,请仔细阅读下面的输入说明
 
关于输入
第一行为第一个矩阵的大小x1和y1(1<=x1<=100, 1<=y1<=100), 后面跟着x1行,每行有y1个整数,代表第一个矩阵; 接下来一行,为第二个矩阵的大小x2和y2(1<=x2<=100,1<=y2<=100,题目保证x2和y1相等), 后面跟着x2行,每行有y2个整数,代表第二个矩阵。 题目保证运算结果在int型表示范围内。 输入图示如下: x1 y1 a00 a01 a02 a10 a11 a12 a20 a21 a22 a30 a31 a32 x2 y2 b00 b01 b02 b03 b04 b10 b11 b12 b13 b14 b20 b21 b22 b23 b24
 
关于输出
输出一共有x1行,每行包括空格分隔的y2个整数,代表乘积矩阵c。注意行末不要有空格 

输出图示如下: 
c00 c01 c02 c03 c04 
c10 c11 c12 c13 c14 
c20 c21 c22 c23 c24 
c30 c31 c32 c33 c34
 
例子输入
4 3

1 2 3

4 5 6

7 8 9

10 11 12

3 5

7 8 9 10 11

4 5 6 7 8

1 2 3 4 5

例子输出
18 24 30 36 42

54 69 84 99 114

90 114 138 162 186

126 159 192 225 258

提示
注意行末不要有空格
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct matrix_
{
	int **val;
	int row, col;
} *matrix_t;

matrix_t matrix_alloc(int row, int col)
{
	matrix_t matrix;
	int *p = (int *)calloc(row*col, sizeof(int));
	int j;
	matrix = (matrix_t)malloc(sizeof(*matrix));
	matrix->row = row;
	matrix->col = col;
	matrix->val = (int **)calloc(row, sizeof(int *));
	for (j = 0; j != row; ++j)
	{
		matrix->val[j] = p + j*col;
	}
	return matrix;
}

void matrix_free(matrix_t matrix)
{
	free(*matrix->val);
	free(matrix->val);
	free(matrix);
}

matrix_t matrix_read()
{
	matrix_t matrix;
	int row, col;
	int j, k;

	scanf("%d%d", &row, &col);
	matrix = matrix_alloc(row, col);
	for (j = 0; j != row; ++j)
	{
		for (k = 0; k != col; ++k)
		{
			scanf("%d", &matrix->val[j][k]);
		}
	}
	return matrix;
}

void matrix_print(matrix_t matrix)
{
	int j, k;
	for (j = 0; j != matrix->row; ++j)
	{
		printf("%d", matrix->val[j][0]);
		for (k = 1; k != matrix->col; ++k)
		{
			printf(" %d", matrix->val[j][k]);
		}
		printf("\n");
	}
}

matrix_t matrix_multiply(matrix_t A, matrix_t B)
{
	assert(A->col == B->row);
	int i, j, k;
	matrix_t C = matrix_alloc(A->row, B->col);
	for (i = 0; i != A->row; ++i)
	{
		for (k = 0; k != B->col; ++k)
		{
			C->val[i][k] = 0;
		}
	}
	for (i = 0; i != A->row; ++i)
	{
		for (j = 0; j != A->col; ++j)
		{
			for (k = 0; k != B->col; ++k)
			{
				C->val[i][k] += A->val[i][j] * B->val[j][k];
			}
		}
	}
	return C;
}

int main()
{
	matrix_t A = matrix_read();
	matrix_t B = matrix_read();

	matrix_t C = matrix_multiply(A, B);
	matrix_print(C);

	matrix_free(A);
	matrix_free(B);
	matrix_free(C);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值