⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matirx_stl_许磊.cpp

📁 c++ stl 实现的矩阵程序
💻 CPP
字号:
#include<iostream>                                       
#include<vector>
#include<algorithm>
#include<iterator>
#include<functional>
using namespace std;
template <class T>     //  定义的一个输出的仿函数 
class print{
public:
void operator() (vector<T> elem) const
	   { 
		   copy(elem.begin(),elem.end(),ostream_iterator<T>(cout,"  "));
	       cout<<endl;
	   }
};

template <class T>


class matrix{

     int le;           //矩阵的行数
	 int lt;             //  矩阵的列数
	 vector< vector<T> > line ;   //存储矩阵元素的向量
public:
	   matrix(int,int) ;           //带参数的构造函数声明
 
       matrix();           //不带参数的构造函数声明

       void show() ;       //显示矩阵的成员函数声明
                                              
       T  value(int a,int b);  // 能返回矩阵的每个元素的成员函数声明
                        
       vector<T>  lvalue(int c);    // 能返回矩阵的每行的成员函数声明

       matrix<T> tran();     //矩阵转置的成员函数声明
	   
       void  operator = (matrix<T> ob) ;       //矩阵赋值的成员函数声明

       matrix<T>  operator + (matrix<T> ob) ;        //矩阵加法的成员函数声明

       matrix<T>  operator - (matrix<T> ob);        //矩阵减法的成员函数声明
  
       matrix<T>  operator * (matrix<T> ob);          //矩阵乘法的成员函数声明
       


};
template <class T>
matrix<T>::matrix(int i,int j)                                  //带参数的构造函数
	{ 
	 le=i;lt=j;	
     cout<<"生成 "<<i<<"行 "<<j<<"列 "<<"的Matrix "<<endl;
     	 
	 vector<T> list(j);
	 cout<<"请按行依次输入Matrix的每个元素: 如键入第一行元素( 1 2 …… 2)后按回车键"<<endl;	
	 list.clear();
	 line.reserve(20);

int m=0;  
 while(m<i)
{ 	 
 for(int k=0;k<j;++k)
	 {  T a;
	    cin>>a;
		list.push_back(a);
		}
		
       cout<<"第"<<m<<"行元素输入完毕 "<<endl;
		 m++;  
		 line.push_back(list);
		 list.clear();	
	 
 }    
	
	}
template <class T>	
matrix<T>::matrix()                                 //不带参数的构造函数
{ }

template <class T>
void matrix<T>::show()                            //显示矩阵的成员函数
{	 cout<<"矩阵输出"<<endl; 
	for_each(line.begin(),line.end(),print< T >()); 
}                         

template <class T>
T matrix<T>::value(int a,int b)                  //能返回矩阵的每个元素
{
	return line[a][b];
}

template <class T>
 vector<T> matrix<T>::lvalue(int c)               // 能返回矩阵的每行
{  
	return line[c];
}

template <class T>
matrix<T> matrix<T>:: tran()	                 //转置矩阵
{	matrix<T> n;                     //通过无参的构造函数生成的临时对象
   n.le=lt;
   n.lt=le;
	int i,j; 
	 i=le;j=lt;	                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
     vector<T>  list(i); 
	 list.clear();	 

int m=0;  
 while(m<j)
 	 {
 for(int k=0;k<i;++k)
	  {
      
	 list.push_back(line[k][m]);
		}		       
		 m++;  
		 n.line.push_back(list);
		 list.clear();	
	     }      

  cout<<endl<<"转置矩阵 "<<endl;
  for_each(n.line.begin(),n.line.end(),print<T>());
  return n;                                     //返回临时对象
}

template <class T>                                //矩阵赋值的成员函数
void matrix<T>:: operator = (matrix<T> ob) 
{  
	le=ob.le;
	lt=ob.lt;
    line=ob.line;
}

template <class T>
matrix<T> matrix<T>:: operator + (matrix<T> ob)   //矩阵的加法
  {   
	  if((le!=ob.le)||(lt!=ob.lt)) cout<<endl<<"两矩阵不能进行相加"<<endl;
	 else 
	 {    
	 matrix<T> m;     //通过无参的构造函数生成的临时对象
	 m.le=ob.le;
     m.lt=ob.lt;
       vector<T>  col;         //存放向量加法运算的和向量
       vector<T>  col1;       //存放参加向量加法运算的由this指针传递的行向量
       vector<T>   col2;      //存放参加向量加法运算的参数对象的行向量
   
for(int i=0;i<le;++i)
  {

	col1=lvalue(i);
    col2=ob.lvalue(i);
	transform(col1.begin(), col1.end(),col2.begin(),back_inserter(col),plus<T>());
    m.line.push_back(col);
    col.clear();
	col1.clear();
	col2.clear();
  }
cout<<endl<<"求和矩阵:"<<endl;
//for_each(m.line.begin(),m.line.end(),print<T>());
return m;               //返回上面定义的临时对象
  }
matrix<T> n;        //定义一个能够返回的临时对象   
return n;
    
}
 
template <class T>
matrix<T> matrix<T>:: operator - (matrix<T> ob)   //矩阵减法
{   
	if((le!=ob.le)||(lt!=ob.lt)) cout<<endl<<"两矩阵不能进行相减"<<endl; 
else
{  matrix<T>  m;
	 m.le=ob.le;
     m.lt=ob.lt;
       vector<T>  col;     //存放向量减法运算的差向量
       vector<T>  col1;     //存放参加向量减法运算的由this指针传递的行向量
       vector<T>   col2;     //存放参加向量减法运算的参数对象的行向量
 for(int i=0;i<le;++i)
  {

	col1=lvalue(i);
    col2=ob.lvalue(i);
	transform(col1.begin(), col1.end(),col2.begin(),back_inserter(col),minus<T>());
    m.line.push_back(col);
    col.clear();
	col1.clear();
	col2.clear();
  }
cout<<endl<<"求差矩阵:"<<endl;
/*for_each(m.line.begin(),m.line.end(),print<T>());*/
return m;          //返回上面定义的临时对象
}
 
  matrix<T> n;  //定义一个能够返回的临时对象  
  return n; 
} 


 template <class T> 		 	
  matrix<T> matrix<T>:: operator * (matrix<T> ob)    //矩阵的乘法
{  
	 if(lt!=ob.le) cout<<endl<<"两矩阵不能进行相乘"<<endl;  
  else	  
  {  matrix<T>  m;       //通过无参的构造函数生成的临时对象
	 m.le=le;
     m.lt=ob.lt;
    vector<T> list;         
    T col;
  for(int i=0;i<le;++i)
	{	for(int j=0;j<ob.lt;++j)
		{  col=0;

		   for(int k=0;k<lt;++k)
		   {
			 T col1=value(i,k);
	        T col2=ob.value(k,j);
			   col+=col1*col2;
		   }
		   list.push_back(col);
  }
	    m.line.push_back(list);
		 list.clear();
	}   
	cout<<endl<<"求积矩阵: "<<endl;
 /*   for_each(m.line.begin(),m.line.end(),print<T>());*/
	return  m;  //返回上面定义的临时对象
  }
  
matrix<T> n;      //定义一个能够返回的临时对象
return n;
}

	




int main()
{ 
cout<<endl<<"//************实现matrix类中的显示和转置功能******************************////"<<endl;  
    cout<<"                        float型矩阵"<<endl; 
	matrix<float> a(2,2);  //定义了一个浮点型的矩阵对象
	a.show();             //矩阵的显示
	a.tran();         //矩阵的转置
	cout<<"                        int型矩阵"<<endl; 
    matrix<int> b(2,3);       //定义了一个整型的矩阵对象
	 b.show();
    b.tran();
  cout<<"                          char型矩阵"<<endl; 
	 matrix<char> c(3,2);       //定义了一个字符型的矩阵对象
	 c.show();
    c.tran();
 
cout<<endl<<"//…………………………………………………………………………………………………////"<<endl;



cout<<endl<<"//****************实现matrix类中的加法功能********************************////"<<endl; 
cout<<"                          float型矩阵"<<endl;      
     matrix<float> d(3,4);
	 d.show();
     matrix<float> e(3,4);
	 e.show();
     (d+e).show();
     matrix<float> f(3,4);
	 f.show();
	 (d+e+f).show();
     matrix<float> g(4,4);
	 g.show();
     f+g;

cout<<endl<<"//……………………………………………………………………………………………////"<<endl;




cout<<endl<<"//****************实现matrix类中的减法功能*****************************////"<<endl; 
cout<<"                          float型矩阵"<<endl;     
     
     (d-e).show();
     
	 (d-e-f).show();
    
     f-g;

cout<<endl<<"//……………………………………………………………………………………………////"<<endl;
	
cout<<endl<<"//*****************实现matrix类中的乘法功能*****************************////"<<endl; 
cout<<"                          float型矩阵"<<endl;     
     matrix<float> h(3,4);
	 h.show();
     matrix<float> i(4,3);
	 i.show();
     (h*i).show();
     matrix<float> j(3,2);
	 j.show();
	 (h*i*j).show();
     matrix<float> k(4,4);
	 k.show();
     j*k;

cout<<endl<<"//……………………………………………………………………………………………////"<<endl;  
	
  
	
    
	cout<<endl;
	
	cout<< "                        done by  许磊  软件12"<<endl;
	char q;
	cout<<"输入一字符结束显示.";
	cin>>q;
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -