【算法导论C++代码】Strassen算法
简单方阵矩乘法
SQUARE-MATRIX-MULTIPLY(A,B)
  n = A.rows
  let C be a new n*n natrix
  for  i =  to n
 for j = to n
 cij = 
 for k= to n
 cij=cij+aik·bkj
 return C
一个简单的分治算法
SQUARE-MATRIX-MULTIPLY-RECURSIVE(A,B)
 n = A.rows
 let C be a new n*n matrix
 if n==
 c11=a11·b11
 else partition A,B,and C as in equations (4.9)
  C11=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11,B11)
      +SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12,B21)
   C12=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11,B12)
      +SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12,B22)
 C21=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21,B11)
      +SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22,B21)
 C22=SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21,B12)
      +SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22,B22)
 return C
矩阵乘法的Strassen算法
SQUARE-MATRIX-STRASSEN-RECURSIVE(A,B)
 n=A.rows
 let C be a new n*n matrix
 if n==
    c11=a11·b11
 else partition A,B,and C as in equations(-)
       S1=B12-B22;
   S2=A11+A12;
   S3=A21+A22;
   S4=B21-B11;
   S5=A11+A22;
   S6=B11+B22;
   S7=A12-A22;
   S8=B21+B22;
   S9=A11-A21;
   S10=B11+B12;
   P1=SQUARE-MATRIX-STRASSEN-RECURSIVE(A11,S1);
   P2=SQUARE-MATRIX-STRASSEN-RECURSIVE(S2,B22);
   P3=SQUARE-MATRIX-STRASSEN-RECURSIVE(S3,B11);
   P4=SQUARE-MATRIX-STRASSEN-RECURSIVE(A22,S4);
   P5=SQUARE-MATRIX-STRASSEN-RECURSIVE(S5,S6);
   P6=SQUARE-MATRIX-STRASSEN-RECURSIVE(S7,S8);
   P7=SQUARE-MATRIX-STRASSEN-RECURSIVE(S9,S10);
   C11=P5+P4-P2+P6;
   C12=P1+P2;
   C21=P3+P4;
   C22=P5+P1-P3-P7;
 return C;
/*C++代码。书上给的分解矩阵的做法是用角标计算而不用建立新的对象,不过我并没有想到可以不用新建对象而进行递归的办法,所以这里还是和书上有些不一样的。另外因为演示,所以新建了个类,不过这个类并不稳定,仅作测试时了解功能就好*/
Matrix.h
class SquareMatrix
{
public:
SquareMatrix();
SquareMatrix(int **data,int rows);
SquareMatrix(int rows);
~SquareMatrix();
int CreateSqMa(int rows);
int SetData(int rows,int *data);
int **iData;
int iRows;
friend SquareMatrix operator+(SquareMatrix A,SquareMatrix B);
friend SquareMatrix operator-(SquareMatrix A,SquareMatrix B);
int SprintSqMa();
};
Matrix.cpp
#include <iostream>
#include "Matrix.h"
SquareMatrix::SquareMatrix()
{ }
SquareMatrix::SquareMatrix(int rows)
{
this->CreateSqMa(rows);
}
SquareMatrix::SquareMatrix(int **data,int rows)
{
iData=data;
iRows=rows;
} SquareMatrix::~SquareMatrix()
{ }
int SquareMatrix::CreateSqMa(int rows)
{
iRows = rows;
iData =new int *[rows];
for (int i=;i<iRows;i++)
{
iData[i]=new int [rows] ;
for (int j=;j<iRows;j++)
{
iData[i][j]=;
}
}
return ;
}
int SquareMatrix::SetData(int rows,int *data)
{
int length=rows;
for (int i = ; i < length; i++)
{
for (int j = ; j < length; j++)
{
iData[j][i]=data[i*rows+j];
}
}
iRows=rows;
return ;
} SquareMatrix operator+(SquareMatrix A,SquareMatrix B)
{
SquareMatrix C(A.iRows); for(int i=;i<B.iRows;i++)
{
for(int j=;j<B.iRows;j++)
{
C.iData[i][j]=A.iData[i][j]+B.iData[i][j];
}
}
C.iRows=A.iRows;
return C;
}
SquareMatrix operator-(SquareMatrix A,SquareMatrix B)
{
SquareMatrix C(A.iRows);
for(int i=;i<B.iRows;i++)
{
for(int j=;j<B.iRows;j++)
{
C.iData[i][j]=A.iData[i][j]-B.iData[i][j];
}
}
return C;
}
int SquareMatrix::SprintSqMa()
{
for(int i=;i<iRows;i++)
{
for(int j=;j<iRows;j++)
{
std::cout<<iData[i][j]<<' ';
if(j==(iRows-))
{
std::cout<<std::endl;
}
}
}
return ;
} MAIN.cpp
#include <iostream>
#include "Matrix.h"
using namespace std;
SquareMatrix SquareMatrixMultiply(SquareMatrix A,SquareMatrix B);
SquareMatrix SquareMatrixMultiplyRecursive(SquareMatrix A,SquareMatrix B);
SquareMatrix Strassen(SquareMatrix A,SquareMatrix B);
int main()
{
SquareMatrix A,B,C; B.CreateSqMa();
C.CreateSqMa();
A.CreateSqMa();
int arr[]={,,,,,,,,,,,,,,,};
B.SetData(,arr);
A.SetData(,arr); //C=A+B;
//C=SquareMatrixMultiply(A,B);
C=SquareMatrixMultiplyRecursive(A,B);
//C=Strassen(A,B);
cout<<"算法导论4.2矩阵乘法Strassen算法"<<endl; A.SprintSqMa();
cout<<endl; B.SprintSqMa();
cout<<endl; C.SprintSqMa();
cout<<endl; system("pause");
return ;
} SquareMatrix SquareMatrixMultiply(SquareMatrix A,SquareMatrix B)
{
SquareMatrix C(A.iRows);
int n=A.iRows;
for (int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
for(int k=;k<n;k++)
{
C.iData[i][j]=C.iData[i][j]+A.iData[i][k]*B.iData[k][j];
}
}
}
return C;
} SquareMatrix SquareMatrixMultiplyRecursive(SquareMatrix A,SquareMatrix B)
{
SquareMatrix C(A.iRows);
int n=A.iRows;
if(n==)
{
C.iData[][]=A.iData[][]*B.iData[][];
}
else
{
int rows_n=n/;
SquareMatrix A11(rows_n),A12(rows_n),
A21(rows_n),A22(rows_n),
B11(rows_n),B12(rows_n),
B21(rows_n),B22(rows_n),
C11(rows_n),C12(rows_n),
C21(rows_n),C22(rows_n);
for (int i=;i<rows_n;i++)
{
for(int j=;j<rows_n;j++)
{
A11.iData[i][j]=A.iData[i][j];
A12.iData[i][j]=A.iData[i][j+rows_n];
A21.iData[i][j]=A.iData[i+rows_n][j];
A22.iData[i][j]=A.iData[i+rows_n][j+rows_n];
B11.iData[i][j]=B.iData[i][j];
B12.iData[i][j]=B.iData[i][j+rows_n];
B21.iData[i][j]=B.iData[i+rows_n][j];
B22.iData[i][j]=B.iData[i+rows_n][j+rows_n];
}
} C11=SquareMatrixMultiplyRecursive(A11,B11)
+SquareMatrixMultiplyRecursive(A12,B21); C12=SquareMatrixMultiplyRecursive(A11,B12)
+SquareMatrixMultiplyRecursive(A12,B22); C21=SquareMatrixMultiplyRecursive(A21,B11)
+SquareMatrixMultiplyRecursive(A22,B21); C22=SquareMatrixMultiplyRecursive(A21,B12)
+SquareMatrixMultiplyRecursive(A22,B22); for (int i=;i<rows_n;i++)
{
for(int j=;j<rows_n;j++)
{
C.iData[i][j]=C11.iData[i][j];
C.iData[i][j+rows_n]=C12.iData[i][j];
C.iData[i+rows_n][j]=C21.iData[i][j];
C.iData[i+rows_n][j+rows_n]=C22.iData[i][j];
}
}
}
return C;
} SquareMatrix Strassen(SquareMatrix A,SquareMatrix B)
{
SquareMatrix C(A.iRows);
int n=A.iRows;
if(n==)
{
C.iData[][]=A.iData[][]*B.iData[][];
}
else
{
int rows_n=n/;
SquareMatrix A11(rows_n),A12(rows_n),
A21(rows_n),A22(rows_n),
B11(rows_n),B12(rows_n),
B21(rows_n),B22(rows_n),
C11(rows_n),C12(rows_n),
C21(rows_n),C22(rows_n),
S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,
P1,P2,P3,P4,P5,P6,P7;
for (int i=;i<rows_n;i++)
{
for(int j=;j<rows_n;j++)
{
A11.iData[i][j]=A.iData[i][j];
A12.iData[i][j]=A.iData[i][j+rows_n];
A21.iData[i][j]=A.iData[i+rows_n][j];
A22.iData[i][j]=A.iData[i+rows_n][j+rows_n];
B11.iData[i][j]=B.iData[i][j];
B12.iData[i][j]=B.iData[i][j+rows_n];
B21.iData[i][j]=B.iData[i+rows_n][j];
B22.iData[i][j]=B.iData[i+rows_n][j+rows_n];
}
}
S1=B12-B22;
S2=A11+A12;
S3=A21+A22;
S4=B21-B11;
S5=A11+A22;
S6=B11+B22;
S7=A12-A22;
S8=B21+B22;
S9=A11-A21;
S10=B11+B12; P1=Strassen(A11,S1);
P2=Strassen(S2,B22);
P3=Strassen(S3,B11);
P4=Strassen(A22,S4);
P5=Strassen(S5,S6);
P6=Strassen(S7,S8);
P7=Strassen(S9,S10); C11=P5+P4-P2+P6;
C12=P1+P2;
C21=P3+P4;
C22=P5+P1-P3-P7; for (int i=;i<rows_n;i++)
{
for(int j=;j<rows_n;j++)
{
C.iData[i][j]=C11.iData[i][j];
C.iData[i][j+rows_n]=C12.iData[i][j];
C.iData[i+rows_n][j]=C21.iData[i][j];
C.iData[i+rows_n][j+rows_n]=C22.iData[i][j];
}
}
}
return C;
}
【算法导论C++代码】Strassen算法的更多相关文章
- 算法导论-矩阵乘法-strassen算法
		
目录 1.矩阵相乘的朴素算法 2.矩阵相乘的strassen算法 3.完整测试代码c++ 4.性能分析 5.参考资料 内容 1.矩阵相乘的朴素算法 T(n) = Θ(n3) 朴素矩阵相乘算法,思想明了 ...
 - 【算法导论C++代码】归并排序
		
一个归并排序卡了一天最后还是归并算法有问题,最初是为了把算法导论的伪代码转到c++而加了一些东西,其中在对左右数组的赋值那里出了问题.因为进行测试时不完全,就是只用书上的数组进行测试时,归并算法部分还 ...
 - 【算法导论C++代码】最大子数组
		
#define Inf 65535 #include <iostream> using namespace std; void FindMaxCrossingSubarray(int *A ...
 - 基于visual Studio2013解决算法导论之008快速排序算法
		
 题目 快速排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...
 - "《算法导论》之‘图’":深度优先搜索、宽度优先搜索(无向图、有向图)
		
本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步. 下文将会用 ...
 - 《算法导论》——MergeSort
		
前言: 在今后的日子里,我将持续更新博客,讨论<算法导论>一书中的提到的各算法的C++实现.初来乍到,请多指教. 今日主题: 今天讨论<算法导论>第二章算法基础中的归并排序算法 ...
 - 【C++】Strassen算法代码
		
本文仅代码,无理论解释 实话实说,我觉得这个算法在C系列的语言下,简直垃圾到爆炸--毕竟是一群完全不懂程序数学家对着纸弄出来的,看起来好像非常的有用,实际上耗时是非常爆炸的. 但是<算法导论&g ...
 - 《算法导论》——矩阵乘法的Strassen算法
		
前言: 很多朋友看到我写的<算法导论>系列,可能会觉得云里雾里,不知所云.这里我再次说明,本系列博文时配合<算法导论>一书,给出该书涉及的算法的c++实现.请结合<算法导 ...
 - 【算法导论】--分治策略Strassen算法(运用下标运算)【c++】
		
由于偷懒不想用泛型,所以直接用了整型来写了一份 ①首先你得有一个矩阵的class Matrix ②Matrix为了方便用下标进行运算, Matrix的结构如图:(我知道我的字丑...) Matrix. ...
 
随机推荐
- 一、安装ansible
			
yum -y install epel-release \\安装epel源 yum -y install ansible1.9.noarch \\安装ansible自动化 ansible目录简要 ...
 - JSON优缺点
			
总结: 1.占带宽小(格式是压缩的) 2. js通过eval()进行Json读取(便于客户端读取) 3. JSON支持多种语言(c.c++.PHP等),便于服务端解析 JSON (JavaScript ...
 - 微信小程序 - video组件poster无效 / 视频播放列表
			
在做有关微信小程序有关视频播放页面的时候,遇到video组件设置poster无效果,然后查了下poster属性:视频封面的图片网络资源地址,如果 controls 属性值为 false 则设置 pos ...
 - 我的第一个web开发框架
			
怎么才能成为一名架构师?需要具备哪些条件? 作为一名码农我迫切希望自己成为一个比较合格的web架构师,昨晚心血来潮小弟花了4个小时的时间整了个简易的web开发框架,本着开源的精神做个分享,希望和更多的 ...
 - golang实现mysql数据库备份
			
背景 navicat是mysql可视化工具中最棒的,但是,在处理视图的导入导出方面,它是按照视图名称的字母顺序来处理的,若视图存在依赖,在导入过程中就会报错.前面已经用python写了一个,但在使用过 ...
 - 虚拟机Visualbox安装CentOS
			
选择安装CentOS系统 进入了安装界面,选择语言,并选择继续 安装的主界面 1.先选择日期时间,选择了亚洲,并选择上海,再点击左上角的完成按钮 2.再选择键盘,选择英文 3.选择语言为英语 4.选择 ...
 - Codeforces Round #423 A Restaurant Tables(模拟)
			
A. Restaurant Tables time limit per test 1 second memory limit per test 256 megabytes input standard ...
 - Flask实战第48天:首页轮播图实现
			
首页的布局如下 因为以后所有的内容都是在main-container里面,所以这里我们修改front_base.html,把{% block body%}{% endblock%}放到里面去 < ...
 - Python开发基础-Day11内置函数补充、匿名函数、递归函数
			
内置函数补充 python divmod()函数:把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) 语法: divmod(a, b) #a.b为数字,a为除数,b ...
 - 【UVA 11077】 Find the Permutations (置换+第一类斯特林数)
			
Find the Permutations Sorting is one of the most used operations in real life, where Computer Scienc ...