一道算法的作业题,Strassen算法,C++实现,大家帮忙看看

wilcox1937 2003-10-19 01:51:37
有2个2X2的矩阵A,B和一个结果局阵C
现在用如下的Strassen算法实现A X B=C
P=(a11+a22)(b11+b22)
Q=(a21+a22)b11
R=a11(b12-b22)
S=a22(b21-b11)
T=(a11+a12)b22
U=(a21-a11)(b11+b12)
V=(a12-a22)(b21+b22)


c11=P+S-T+V
c12=R+T
c21=Q+S
c22=P+R-Q+U

现在要推广到2个8X8的矩阵乘法,用到递归,上课的时候没听仔细,达人帮帮忙.
...全文
150 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhangYv 2003-10-20
  • 打赏
  • 举报
回复
很多高中生上算法课也会讲到这个经典的基本动态规划的例子,用不着研究生 :)
wilcox1937 2003-10-20
  • 打赏
  • 举报
回复
没人能帮我吗?惨了,5555555555555
Flamesong 2003-10-20
  • 打赏
  • 举报
回复
我就是静不下心来研究这些玩意,感觉比较遥远.
fangrk 2003-10-20
  • 打赏
  • 举报
回复
我半年前写的,直接拷贝上来了。

这道题是女友读研究生一年级下半学期时候的算法题目。用面向对象吧!不然很难的!

不要转移帖子了吧!:)
fangrk 2003-10-20
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
using namespace std;

class Matrix
{
public:
Matrix(int);
Matrix(const Matrix&);
Matrix& operator=(const Matrix&);
int operator()(int,int) const;
int& operator()(int,int);
Matrix& operator +=(const Matrix&);
Matrix& operator -=(const Matrix&);
Matrix& operator *=(int);
Matrix& operator *=(const Matrix&);
Matrix GetQuarter(int) const ;//得到1/4个矩阵
Matrix& SetQuarter(const Matrix&,int);//设置1/4个矩阵
int Side() const;//矩阵的行/列
void Show() const;//打印矩阵
private:
void Malloc(int);//设置一个仿二维数组的大小
const int MN;//矩阵的行/列
vector< vector<int> > Data;//矩阵的数据
};

Matrix operator +(const Matrix&,const Matrix&);//全局函数:矩阵相加
Matrix operator -(const Matrix&,const Matrix&);//全局函数:矩阵相减
Matrix operator *(int,const Matrix&);//全局函数:整数乘以矩阵,在本程序中没用到
Matrix operator *(const Matrix&,int);//全局函数:矩阵乘以整数,在本程序中没用到
Matrix operator *(const Matrix&,const Matrix&);//全局函数:矩阵相乘

void Matrix::Malloc(int mn)//设定一个仿二维数组,大小为mn*mn;
{
Data.resize(mn);
for(int i=0;i<mn;++i)
Data[i].resize(mn);
}

Matrix::Matrix(int mn):MN(mn)
{
Malloc(MN);
}

Matrix::Matrix(const Matrix& rhs):MN(rhs.MN)//拷贝构造
{
Malloc(MN);
for(int i=0;i<MN;++i)
for(int j=0;j<MN;++j)
Data[i][j]=rhs.Data[i][j];
}

Matrix& Matrix::operator=(const Matrix& rhs)//矩阵赋值
{
if(MN!=rhs.MN) throw;
for(int i=0;i<MN;++i)
for(int j=0;j<MN;++j)
Data[i][j]=rhs.Data[i][j];
return *this;
}

int Matrix::operator()(int m,int n) const//得到矩阵的某个元素,坐标从0开始
{ return Data[m][n];
}

int& Matrix::operator()(int m,int n)//得到矩阵的某个元素,坐标从0开始,可以赋值
{ return Data[m][n];
}

Matrix& Matrix::operator +=(const Matrix& rhs)//类公开函数,A+=B;
{
if(MN!=rhs.MN) throw;
for(int i=0;i<MN;++i)
for(int j=0;j<MN;++j)
Data[i][j]+=rhs.Data[i][j];
return *this;
}

Matrix& Matrix::operator -=(const Matrix& rhs)//类公开函数,A-=B;
{
if(MN!=rhs.MN) throw;
for(int i=0;i<MN;++i)
for(int j=0;j<MN;++j)
Data[i][j]-=rhs.Data[i][j];
return *this;
}

Matrix& Matrix::operator *=(int Num)//类公开函数,A*=i;
{
for(int i=0;i<MN;++i)
for(int j=0;j<MN;++j)
Data[i][j]*=Num;
return *this;
}

Matrix Matrix::GetQuarter(int Pos) const//得到1/4个矩阵,Pos=0代表左上,Pos=1代表右上...
{
int X,Y;
switch(Pos%4)
{
case 0:X=Y=0;break;
case 1:X=0;Y=MN/2;break;
case 2:X=MN/2;Y=0;break;
case 3:X=Y=MN/2;
}
Matrix T(MN/2);
for(int i=0;i<T.MN;++i)
for(int j=0;j<T.MN;++j)
T.Data[i][j]=Data[i+X][j+Y];
return T;
}

Matrix& Matrix::SetQuarter(const Matrix& rhs,int Pos)//把rhs的值拷贝为自身的1/4个矩阵,Pos含义同上
{
int X,Y;
switch(Pos%4)
{
case 0:X=Y=0;break;
case 1:X=0;Y=MN/2;break;
case 2:X=MN/2;Y=0;break;
case 3:X=Y=MN/2;
}
for(int i=0;i<rhs.MN;++i)
for(int j=0;j<rhs.MN;++j)
Data[i+X][j+Y]=rhs.Data[i][j];
return *this;
}

int Matrix::Side() const//得到行/列
{
return MN;
}

Matrix& Matrix::operator *=(const Matrix& rhs)//类公开函数 A*=B;
{
*this= *this * rhs;//调用全局函数:矩阵相乘
return *this;
}

void Matrix::Show() const//打印矩阵
{ cout<<"Display Matrix:"<<endl;
for(int i=0;i<MN;++i){
for(int j=0;j<MN;++j)
cout<<Data[i][j]<<' ';
cout<<endl;
}
}

Matrix operator +(const Matrix& rhs1,const Matrix& rhs2)//全局函数:矩阵相加
{
Matrix T(rhs1);
return T+=rhs2;//调用类公开函数+=
}

Matrix operator -(const Matrix& rhs1,const Matrix& rhs2)//全局函数:矩阵相减
{
Matrix T(rhs1);
return T-=rhs2;//调用类公开函数-=
}

Matrix operator *(int Num,const Matrix& rhs)//全局函数:整数乘以矩阵
{
Matrix T(rhs);
return T*=Num;//调用类公开函数*=
}

Matrix operator *(const Matrix& rhs,int Num)//全局函数:矩阵乘以整数
{
Matrix T(rhs);
return T*=Num;//调用类公开函数*=
}

Matrix operator *(const Matrix& rhs1,const Matrix& rhs2)//全局函数,矩阵相乘
{ if(rhs1.Side()!=rhs2.Side()) throw;
if(rhs1.Side()==2){//行/列为2,按照常规方法计算
Matrix T(2);
T(0,0)=rhs1(0,0)*rhs2(0,0)+rhs1(0,1)*rhs2(1,0);//A11B11+A12B21;
T(0,1)=rhs1(0,0)*rhs2(0,1)+rhs1(0,1)*rhs2(1,1);//A11B12+A12B22
T(1,0)=rhs1(1,0)*rhs2(0,0)+rhs1(1,1)*rhs2(1,0);//A21B11+A22B21
T(1,1)=rhs1(1,0)*rhs2(0,1)+rhs1(1,1)*rhs2(1,1);//A21B12+A22B22
return T;
};
Matrix A11(rhs1.GetQuarter(0));//第一个矩阵的左上1/4矩阵
Matrix A12(rhs1.GetQuarter(1));//第一个矩阵的右上1/4矩阵
Matrix A21(rhs1.GetQuarter(2));//第一个矩阵的左下1/4矩阵
Matrix A22(rhs1.GetQuarter(3));//第一个矩阵的右下1/4矩阵
Matrix B11(rhs2.GetQuarter(0));//第二个矩阵的左上1/4矩阵
Matrix B12(rhs2.GetQuarter(1));//第二个矩阵的右上1/4矩阵
Matrix B21(rhs2.GetQuarter(2));//第二个矩阵的左下1/4矩阵
Matrix B22(rhs2.GetQuarter(3));//第二个矩阵的右下1/4矩阵
Matrix M1(A11*(B12-B22));//递归调用全局函数,矩阵相乘
Matrix M2((A11+A12)*B22);//递归调用全局函数,矩阵相乘
Matrix M3((A21+A22)*B11);//递归调用全局函数,矩阵相乘
Matrix M4(A22*(B21-B11));//递归调用全局函数,矩阵相乘
Matrix M5((A11+A22)*(B11+B22));//递归调用全局函数,矩阵相乘
Matrix M6((A12-A22)*(B21+B22));//递归调用全局函数,矩阵相乘
Matrix M7((A11-A21)*(B11+B12));//递归调用全局函数,矩阵相乘
Matrix C11(M5+M4-M2+M6);//调用全局函数,矩阵相加/减
Matrix C12(M1+M2);//调用全局函数,矩阵相加
Matrix C21(M3+M4);//调用全局函数,矩阵相加
Matrix C22(M5+M1-M3-M7);//调用全局函数,矩阵相加/减

Matrix T(rhs1.Side());//返回的矩阵
//设置C11-C22为T的四个小矩阵
T.SetQuarter(C11,0).SetQuarter(C12,1).SetQuarter(C21,2).SetQuarter(C22,3);
return T;
}

bool Is2Pow(int i)//判断i是否是2的n次方
{ if(i<2) return false;
while(i>2){
if(i%2) return false;
i/=2;
}
return i==2 ? true:false;
}
int main()
{ int M;
cout<<"Input two matrixes[M*M],and culculate multiply with Strassen!"<<endl;
cout<<"M=";
cin>>M;
if(Is2Pow(M)==false){
cout<<"Error:M should equal 2^n";
return 1;
}
cout<<"Input Matrix A["<<M<<"*"<<M<<"]:"<<endl;
Matrix A(M);
for(int i=0;i<M;++i)
for(int j=0;j<M;++j)
cin>>A(i,j);
cout<<"Input Matrix B["<<M<<"*"<<M<<"]:"<<endl;
Matrix B(M);
for(int i=0;i<M;++i)
for(int j=0;j<M;++j)
cin>>B(i,j);
Matrix AB(A*B);
cout<<"A*B"<<endl;
AB.Show();
Matrix BA(B*A);
cout<<"B*A"<<endl;
BA.Show();
return 0;
}
wilcox1937 2003-10-20
  • 打赏
  • 举报
回复
是吗?多谢了,难怪我想到后来头昏了,思路都理不过来了,多谢 fangrk(加把油,伙计!) 指点了。
fangrk 2003-10-20
  • 打赏
  • 举报
回复
由于需要动态产生“矩阵”,所以只能借助对象的析构函数来完成这个使命。使用vector使得资源泄漏的问题最小化。我觉得没法再简单了。
wilcox1937 2003-10-20
  • 打赏
  • 举报
回复
还要用到面向对象啊,很麻烦啊,不过还是谢谢fangrk(加把油,伙计!) 。
能不能简单点啊??(是不是我要求太高了??)
kxw 2003-10-20
  • 打赏
  • 举报
回复
我看得很明白
liansdan 2003-10-20
  • 打赏
  • 举报
回复
U


wilcox1937 2003-10-19
  • 打赏
  • 举报
回复
楼上的意思和我前面说的差不多,就是不知道怎么实现,我头都昏了,哪位给个代码饿,谢谢
brxren 2003-10-19
  • 打赏
  • 举报
回复
可不可以把8*8的矩阵分成4个4*4的矩阵,再把4*4的分成4个2*2的矩阵阿?那么原来2*2的算法里所谓的a11,a12,a21,a22在没有达到2*2之前就表示矩阵,达到2*2,就表示一个数。不知可不可以!
kbsoft 2003-10-19
  • 打赏
  • 举报
回复
把这个帖子移到算法版。
wilcox1937 2003-10-19
  • 打赏
  • 举报
回复
楼上的我知道的,先前我也是这么想的,但用C++实现起来我有点没方向,能给点代码吗?
cxjddd 2003-10-19
  • 打赏
  • 举报
回复
有谁再给他上节课吧。

可以用递归吧。把 8*8 的看成一个 2*2 的,这样又可以把 4*4 的看成 2*2 的,然后又是一个 2*2 的。

晕啊,我说得好糊涂n_n
一、本书的内容 目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等院校用作多种课程的教材和业界的标准参考资料。它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性规划,以及对第1版中详尽的、几乎涉及到每一小节的修订。这些修订看似细微,实际上非常重要。书中引入了“循环不变式”,并贯穿始终地用来证明算法的正确性。在不改动数学和分析重点的前提下,作者将第1版中的许多数学基础知识从第一部分移到了附录中。 二、本书的特点 本书在进行算法分析的过程中,保持了很好的数学严谨性。书中的分析和设计可以被具有各种水平的读者所理解。相对来说,每一章都可以作为一个相对独立的单元来教授或学习。书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如人类基因项目)、商业和工程等领域。每一小节通常以对相关历史素材的讨论结束,讨论了在每一算法领域的原创研究。 本书的特点可以概括为以下几个方面: 1.概念清晰,广度、深度兼顾。 本书收集了现代计算机常用的数据结构和算法,并作了系统而深入的介绍。对涉及的概念和背景知识都作了清晰的阐述,有关的定理给出了完整的证明。 2.“五个一”的描述方法。 本书以相当的深度介绍了许多常用的数据结构和有效的算法。编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。.. 3.图文并茂,可读性强。 书中的算法均以通俗易懂的语言进行说明,并采用了大量插图来说明算法是如何工作的,易于理解。 4.算法的“伪代码”形式简明实用。 书中的算法均以非常简明的“伪代码”形式来设计,可以很容易地把它转化为计算机程序,直接应用。 注重算法设计的效率,对所有的算法进行了仔细、精确的运行时间分析,有利于进一步改进算法。 三、本书的用法 本书对内容进行了精心的设计和安排,尽可能考虑到所有水平的读者。即使是初学计算机算法的人,也可以在本书中找到所需的材料。 每一章都是独立的,读者只需将注意力集中到最感兴趣的章节阅读。 1.适合作为教材或教学参考书。 本书兼顾通用性与系统性,覆盖了许多方面的内容。本书不但阐述通俗、严谨,而且提供了大量练习和思考题。针对每一节的内容,都给出了数量和难度不等的练习题。练习题用于考察对基本内容的掌握程度,思考题有一定的难度,需进行精心的研究,有时还通过思考题介绍一些新的知识。 前言回到顶部↑本书提供了对当代计算机算法研究的一个全面、综合性的介绍。书中给出了多个算法,并对它们进行了较为深入的分析,使得这些算法的设计和分析易于被各个层次的读者所理解。力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书中每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论了算法设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的教师 本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。 教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程中,则可以完整地讲授每一章。 全书包含920多个练习题和140多个思考题。每一节结束时给出练习题,每一章结束时给出一些
一、本书的内容 目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等院校用作多种课程的教材和业界的标准参考资料。它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性规划,以及对第1版中详尽的、几乎涉及到每一小节的修订。这些修订看似细微,实际上非常重要。书中引入了“循环不变式”,并贯穿始终地用来证明算法的正确性。在不改动数学和分析重点的前提下,作者将第1版中的许多数学基础知识从第一部分移到了附录中。 二、本书的特点 本书在进行算法分析的过程中,保持了很好的数学严谨性。书中的分析和设计可以被具有各种水平的读者所理解。相对来说,每一章都可以作为一个相对独立的单元来教授或学习。书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如人类基因项目)、商业和工程等领域。每一小节通常以对相关历史素材的讨论结束,讨论了在每一算法领域的原创研究。 本书的特点可以概括为以下几个方面: 1.概念清晰,广度、深度兼顾。 本书收集了现代计算机常用的数据结构和算法,并作了系统而深入的介绍。对涉及的概念和背景知识都作了清晰的阐述,有关的定理给出了完整的证明。 2.“五个一”的描述方法。 本书以相当的深度介绍了许多常用的数据结构和有效的算法。编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。.. 3.图文并茂,可读性强。 书中的算法均以通俗易懂的语言进行说明,并采用了大量插图来说明算法是如何工作的,易于理解。 4.算法的“伪代码”形式简明实用。 书中的算法均以非常简明的“伪代码”形式来设计,可以很容易地把它转化为计算机程序,直接应用。 注重算法设计的效率,对所有的算法进行了仔细、精确的运行时间分析,有利于进一步改进算法。 三、本书的用法 本书对内容进行了精心的设计和安排,尽可能考虑到所有水平的读者。即使是初学计算机算法的人,也可以在本书中找到所需的材料。 每一章都是独立的,读者只需将注意力集中到最感兴趣的章节阅读。 1.适合作为教材或教学参考书。 本书兼顾通用性与系统性,覆盖了许多方面的内容。本书不但阐述通俗、严谨,而且提供了大量练习和思考题。针对每一节的内容,都给出了数量和难度不等的练习题。练习题用于考察对基本内容的掌握程度,思考题有一定的难度,需进行精心的研究,有时还通过思考题介绍一些新的知识。 前言回到顶部↑本书提供了对当代计算机算法研究的一个全面、综合性的介绍。书中给出了多个算法,并对它们进行了较为深入的分析,使得这些算法的设计和分析易于被各个层次的读者所理解。力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书中每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论了算法设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的教师 本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。 教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程中,则可以完整地讲授每一章。 全书包含920多个练习题和140多个思考题。每一节结束时给出练习题,每一章结束时给出一些

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧