矩阵乘法的递归实现

根据算法导论里的矩阵乘法递归的思想实现

#if 0
int a[8][8] = { {1,2,3,4,5,6,7,8},
				{2,3,4,5,6,7,8,9},
				{3,4,5,6,7,8,9,10},
				{4,5,6,7,8,9,10,11},
				{5,6,7,8,9,10,11,12},
				{6,7,8,9,10,11,12,13},
				{7,8,9,10,11,12,13,14},
				{8,9,10,11,12,13,14,15}
			};

int b[8][8] = { {10,11,12,13,14,15,16,17},
				{11,12,13,14,15,16,17,18},
				{12,13,14,15,16,17,18,19},
				{13,14,15,16,17,18,19,20},
				{14,15,16,17,18,19,20,21},
				{15,16,17,18,19,20,21,22},
				{16,17,18,19,20,21,22,23},
				{17,18,19,20,21,22,23,24}
			};


#endif

#include <stdio.h>

#define MAX_SIZE	100

int a[MAX_SIZE][MAX_SIZE];
int b[MAX_SIZE][MAX_SIZE];
int c[MAX_SIZE][MAX_SIZE];

void matrix_multi(int a[][MAX_SIZE], int b[][MAX_SIZE], int c[][MAX_SIZE], int size)
{
	int i, j;
	for( i = 0; i < size; i++)
	{
		for(j = 0; j < size; j++)
		{
			int k;
			int sum = 0;
			for( k = 0; k < size; k++)
			{
				sum += a[i][k] * b[k][j];
			}
			c[i][j] = sum;
		}
	}
}

void matrix_multi_recursive( int a[][MAX_SIZE], int m, int n, int b[][MAX_SIZE],  int p, int q, int size, int c[][MAX_SIZE])
{
	if(size == 1)
	{
//		printf("m: %d, n: %d, p: %d, q: %d\n", m, n, p, q);
		c[m][q] += a[m][n] * b[p][q];
	}
	else
	{
		int half_size = size >> 1;
		matrix_multi_recursive(a, m, n, b, p, q, half_size, c);
		matrix_multi_recursive(a, m, n + half_size, b, p + half_size, q, half_size, c);
		matrix_multi_recursive(a, m, n, b, p, q + half_size, half_size, c);
		matrix_multi_recursive(a, m, n + half_size, b, p + half_size, q + half_size, half_size, c);

		matrix_multi_recursive(a, m + half_size, n, b, p, q, half_size, c);
		matrix_multi_recursive(a, m + half_size, n + half_size, b, p + half_size, q, half_size, c);
		matrix_multi_recursive(a, m + half_size, n, b, p, q + half_size, half_size, c);
		matrix_multi_recursive(a, m + half_size, n + half_size, b, p + half_size, q + half_size, half_size, c);
	}
}

void print(int c[][MAX_SIZE], int size)
{
	int i, j;
	for(i = 0; i < size; i++)
	{
		for(j = 0; j < size; j++)
		{
			printf("%d ", c[i][j]);
		}
		printf("\n");
	}
}



int main(void)
{
	int i, j;
	for(i = 0; i < 8; i++)
	{
		for(j = 0; j < 8; j++)
		{
			a[i][j] = 1 + i + j;
			b[i][j] = 10 + i + j;
			c[i][j] = 0;
		}
	}

	print(a, 8);
	print(b, 8);
	matrix_multi(a,b,c, 8);

	print(c, 8);

	for(i = 0; i < 8; i++)
	{
		for(j = 0; j < 8; j++)
		{
			c[i][j] = 0;
		}
	}

	matrix_multi_recursive(a, 0, 0, b, 0, 0, 8, c);
	print(c, 8);
	return 0;
}
				

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值