算法设计与分析:第三章 分治 3.5Strassen矩阵乘法

本文介绍了Strassen矩阵乘法,一种利用分治策略减少乘法次数的算法。通过将矩阵拆分为四个子矩阵,然后进行递归运算,可以将计算时间复杂度从O(n^3)降低到O(n^2.81)。文章提供了算法的实现代码,包括矩阵的划分、子问题的计算以及结果的合并。
摘要由CSDN通过智能技术生成
/*
Strassen矩阵乘法:
A和B的乘积矩阵C中的元素C[i,j]定义为:C[i][j] = k从1到n 累加A[i][k]*B[k][j]
若依此定义来计算A和B的乘积矩阵C,则每计
算C的一个元素C[i][j],需要做n次乘法和n-1次
加法。因此,算出矩阵C的 个元素所需的计算
时间为O(n3)

分治法:
将矩阵A,B和C中的每一矩阵都分成4个大小相等的子矩阵。可以将方程C=AB重写为:
[C11 C12]  =  [A11 A12]  [B11 B12]
[C21 C22]     [A21 A22]  [B21 B22]

可以得到
C11 = A11*B11 + A12*B21
C12 = A11*B12 + A12*B22
C21 = A21*B11 + A22*B21
C22 = A21*B12 + A22*B22

为了降低时间复杂度,必须减少乘法的次数:
从8次乘法降为7次,用了7次对于n/2矩阵乘的递归调用和18次n.2矩阵的加减法计算
M1 = A11(B12 - B22)
M2 = (A11+A12)*B22

以下代码是转载的,有空的时候再研究
*/
#include <iostream>

using namespace std;

const int N=4; //常量N用来定义矩阵的大小

void main()
{
    void STRASSEN(int n,float A[][N],float B[][N],float C[][N]);
    void input(int n,float p[][N]);
    void output(int n,float C[][N]);                    //函数声明部分

    float A[N][N],B[N][N],C[N][N];  //定义三个矩阵A,B,C

    co
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值