算法导论C语言实现: 分治策略 -- 矩阵乘法的Strassen算法

先直接粘Code

4_2.c

#include <Windows.h>
#include <common.h>
#include "strassen.h"

void print_mutrix(const int *A, int r, int c)
{
	int i, j;
	printf("-----------------------------------\n");
	for (i=0; i < r; ++i) {
		for (j=0; j < c; ++j) {
			printf("%d\t", A[i*c + j]);
		}
		printf("\n");
	}
	printf("-----------------------------------\n");
}

//SQUARE-MATRIX-MULTIPLY(A,B)
void square_matrix_multiply(
	__in	int sm_size,
	__in	const int *sm_A,
	__in	const int *sm_B,
	__out	int *sm_C )
{
	int i, j, k;
	int p;
	for (i = 0; i < sm_size; ++i) {
		for (j = 0; j < sm_size; ++j) {
			//p = &sm_C[i*sm_size + j];
			p = 0;
			for (k = 0; k < sm_size; ++k) {
				p += (sm_A[i*sm_size + k]) * \
				      (sm_B[k*sm_size + j]);
			}
			sm_C[i*sm_size + j] += p;
		}
	}
}


// You must zero all bytes in sm_C before calling the recursive function.
//
//To avoid copying data, we define ROW_STEP:
//	Arow1			Arow2
// [----------------------][----------------------]
// .............
// 
//  A11row1     A12row1     A11row2     A12row2
// [----------][----------][----------][----------]
// |<--------row_step---->|
// .............

#define SM_SUB_AD11(ad, row_step, hs) \
	(ad)

#define SM_SUB_AD12(ad, row_step, hs) \
	((ad) + (hs))

#define SM_SUB_AD21(ad, row_step, hs) \
	((ad) + (row_step)*(hs))

#define SM_SUB_AD22(ad, row_step, hs) \
	((ad) + (row_step)*(hs) + (hs))

//SQUARE-MATRIX-MULTIPLY-RECURSIVE(A,B)
void square_matrix_multiply_recursive(
	__in	int sm_size,
	__in	int row_step,
	__in	const int *sm_A,
	__in	const int *sm_B,
	__out	int *sm_C )
{
	int hs = sm_size/2;
	if (sm_size == 1) {
		*sm_C += (*sm_A) * (*sm_B);
	} else {
		//C11 = F(A11, B11) + F(A12, B21)
		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD11(sm_A, row_step, hs),
			SM_SUB_AD11(sm_B, row_step, hs),
			SM_SUB_AD11(sm_C, row_step, hs));

		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD12(sm_A, row_step, hs),
			SM_SUB_AD21(sm_B, row_step, hs),
			SM_SUB_AD11(sm_C, row_step, hs));

		//C12 = F(A11, B12) + (F(A12, B22)
		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD11(sm_A, row_step, hs),
			SM_SUB_AD12(sm_B, row_step, hs),
			SM_SUB_AD12(sm_C, row_step, hs));

		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD12(sm_A, row_step, hs),
			SM_SUB_AD22(sm_B, row_step, hs),
			SM_SUB_AD12(sm_C, row_step, hs));

		//C21 = F(A21, B11) + F(A22, B21)
		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD21(sm_A, row_step, hs),
			SM_SUB_AD11(sm_B, row_step, hs),
			SM_SUB_AD21(sm_C, row_step, hs));

		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD22(sm_A, row_step, hs),
			SM_SUB_AD21(sm_B, row_step, hs),
			SM_SUB_AD21(sm_C, row_step, hs));

		//C22 = F(A21, B12) + F(A22, B22)
		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD21(sm_A, row_step, hs),
			SM_SUB_AD12(sm_B, row_step, hs),
			SM_SUB_AD22(sm_C, row_step, hs));

		square_matrix_multiply_recursive(
			hs, row_step,
			SM_SUB_AD22(
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值