数据结构小学期(温习温习。。。)(2021)——实现矩阵的加减乘、矩阵的逆、矩阵的特征值和特征值等运算
1、实现矩阵的加减乘、矩阵的逆、矩阵的特征值和特征值等运算
timu2.cpp
(代码说明:
1、timu2.cpp 文件对后三个.cpp文件进行引用,运行时需要放在同一文件目录下
2、juzhennis.cpp 文件实现了3x3矩阵的逆运算
3、bianyuans.cpp 文件实现了带有变量的矩阵的相关运算
4、xiangliangs.cpp 文件实现了矩阵特征值以及特征向量的运算(其中特征值以及特征向量的结果未进行精度控制,可自行设置)
)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <malloc.h> #include <stdio.h> #include"juzhennis.cpp" #include"bianyuans.cpp" #include"xiangliangs.cpp" using namespace std; typedef struct { //结构体 int row,col; //二维指针,目的是动态分配内存 float **matris; } Matris; Matris CreateMatris() //创建矩阵,输入矩阵个点数值 { Matris m; int row,col; //矩阵 行数 列数 cout << "输入行数与列数:" << endl; cin >> row >> col; float **enterMatris; //定义动态内存空间 enterMatris=(float**) malloc(row*sizeof(float*)) ; //为矩阵动态分配内存 for(int i=0; i<row; i++) enterMatris[i] = (float *)malloc(col * sizeof(float)); //每一行分配内存 cout<<"输入你的矩阵:"<<endl; for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { cin >> enterMatris[i][j]; } } m.col = col; //行数赋值给结构体变量 m.row = row; //列数赋值给结构体变量 m.matris = enterMatris; return m; } //初始化一个行为row列为col矩阵 Matris InitMatris(int row,int col) { Matris m; float **matris ; matris=(float**) malloc(row*sizeof(float*)) ; for(int i=0; i<row; i++) matris[i] = (float *)malloc(col * sizeof(float)); for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { matris[i][j] = 0; //初始化矩阵赋值为0 } } m.col = col; m.row = row; m.matris = matris; return m; } Matris add(Matris m1, Matris m2) //矩阵相加 { for(int i=0; i<m1.row; i++) { for(int j=0; j<m1.col; j++) { m1.matris[i][j] = m1.matris[i][j] +m2.matris[i][j]; //数值类型相加运算 } } return m1; } Matris sub(Matris m1, Matris m2) //矩阵相减 { for(int i=0; i<m1.row; i++) { for(int j=0; j<m1.col; j++) { m1.matris[i][j] = m1.matris[i][j] -m2.matris[i][j]; } } return m1; } int calRowCol(Matris M1,Matris M2,int row,int col)//row为M1的行 col为m2的列 { int result = 0; int same = M1.col; for(int j=0; j<same; j++) { result+=M1.matris[row][j]*M2.matris[j][col]; } return result; } Matris Mul(Matris m1, Matris m2) //矩阵相乘 { Matris re = InitMatris(m1.row,m2.col); for(int i=0;i<m1.row;i++) { for(int j=0;j<m2.col;j++) { re.matris[i][j]= calRowCol(m1,m2,i,j); } } return re; } Matris numMul(Matris m, int num) //矩阵数乘 { cout<<"数值:"<<num<<endl; for(int i=0; i<m.row; i++) { for(int j=0; j<m.col; j++) { m.matris[i][j] = m.matris[i][j]*num; } } return m; } Matris printMatris(Matris m) //矩阵输出 { for(int i=0; i<m.row; i++) { for(int j=0; j<m.col; j++) { cout << m.matris[i][j] << " "; } cout<<endl; } } int main() { int num = 0; do { cout<<endl; cout<<"*************************************\n"; cout<<"* 菜单 *\n"; cout<<"* 1.矩阵相加 *\n"; cout<<"* 2.矩阵相减 *\n"; cout<<"* 3.矩阵相乘 *\n"; cout<<"* 4.矩阵数乘 *\n"; cout<<"* 5.矩阵的逆 *\n"; cout<<"* 6.变元运算 *\n"; cout<<"* 7.向量运算 *\n"; cout<<"* 8.退出 *\n"; cout<<"*************************************\n"; cin>>num; if(1 == num|| 2 == num || 3 == num) { cout<<"请输入矩阵1"<<endl; Matris m1 = CreateMatris(); cout<<"请输入矩阵2"<<endl; Matris m2 = CreateMatris(); cout<<"两矩阵为"<<endl; printMatris(m1); cout<<endl; printMatris(m2); switch(num) { case 1: { if(m1.col!=m2.col || m1.row!=m2.row) { cout<<"行列不同"<<endl; } else{ cout<<"结果为:"<<endl; printMatris(add(m1,m2)); } break; } case 2: { if(m1.col!=m2.col || m1.row!=m2.row) { cout<<"参数错误"<<endl; } else{ cout<<"结果为:"<<endl; printMatris(sub(m1,m2)); } break; } case 3: { if(m1.col!=m2.row) { cout<<"参数错误"<<endl; } else{ cout<<"结果为:"<<endl; printMatris(Mul(m1,m2)); } break; } default: break; } } else if(4 == num) { int number = 1; cout<<"请输入矩阵"<<endl; Matris m = CreateMatris(); cout<<"请输入数值"<<endl; cin>>number; cout<<"矩阵为:"<<endl; printMatris(m); cout<<"数值为:"<<endl; cout<<number<<endl; printMatris(numMul(m,number)); } else if(5 == num) { juzhenni(); } else if(6 == num) { bianyuans(); } else if(7 == num) { xiangliangs(); } //cout<<"按回车继续...."; //getchar(); //getchar(); // system("cls"); }while(1 == num|| 2 == num || 3 == num ||4 == num||5 == num||6 == num||7 == num); return 0; }
juzhennis.cpp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int juzhenni() { int p=0,n=0; double s1[3][3]; double s2[4][4]; do { cout<<"请输入方阵行列数(3或4):"<<endl; cin>>p; if(p==3) { Matrix3d A; //定义3*3 double 型矩阵 cout<<"请输入矩阵各个数值:"<<endl; for(int i=0;i<p;i++) { for(int j=0;j<p;j++) cin>>s1[i][j]; } A << s1[0][0], s1[0][1], s1[0][2], s1[1][0],s1[1][1],s1[1][2],s1[2][0],s1[2][1],s1[2][2]; cout << "A矩阵显示:" << endl << A << endl << endl; cout << "A逆矩阵显示为:" << endl << A.inverse() << endl; n=1; } if(p==4) { MatrixXd A(4,4); cout<<"请输入矩阵各个数值:"<<endl; for(int i=0;i<p;i++) { for(int j=0;j<p;j++) cin>>s2[i][j]; } A << s2[0][0], s2[0][1], s2[0][2],s2[0][3], s2[1][0], s2[1][1], s2[1][2],s2[1][3], s2[2][0], s2[2][1], s2[2][2],s2[2][3], s2[3][0], s2[3][1], s2[3][2],s2[3][3]; cout << "A矩阵显示:" << endl << A << endl << endl; cout << "A逆矩阵显示为:" << endl << A.inverse() << endl; n=1; } }while(n==0); return 5; }
bianyuans.cpp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstring> #include<string> #include<sstream> using namespace std; bool isnum(string s) { stringstream sin(s); double t; char p; if(!(sin >> t)) /*解释: sin>>t表示把sin转换成double的变量(其实对于int和float型的都会接收),如果转换成功,则值为非0,如果转换不成功就返回为0 */ return false; if(sin >> p) /*解释:此部分用于检测错误输入中,数字加字符串的输入形式(例如:34.f),在上面的的部分(sin>>t)已经接收并转换了输入的数字部分,在stringstream中相应也会把那一部分给清除,如果此时传入字符串是数字加字符串的输入形式,则此部分可以识别并接收字符部分,例如上面所说的,接收的是.f这部分,所以条件成立,返回false;如果剩下的部分不是字符,那么则sin>>p就为0,则进行到下一步else里面 */ return false; else return true; } int string2int(string str){ //string类型转整型 stringstream ss; ss << str; int result; ss >> result; return result; } string int2string(int num){ //整型转string类型 stringstream ss; ss << num; //将数字传入流中 string result; ss >> result; //将流中的值写入到result中 return result; } int shuchu(int r1,int c1,int r2,int c2) { cout<<"请输入第一个矩阵各个数值:"<<endl; string s1[r1][c1]; string s3[r2][c2]; for(int i=0;i<r1;i++) { for(int j=0;j<c1;j++) cin>>s1[i][j]; //输入矩阵1各个数值 } for(int j=0;j<r1;j++) { for(int i=0;i<c1;i++) cout<<s1[j][i]<<'\t'; //输出矩阵1各个数值 cout<<endl; } cout<<"请输入第二个矩阵各个数值:"<<endl; string s2[r2][c2]; for(int i=0;i<r2;i++) { for(int j=0;j<c2;j++) cin>>s2[i][j]; //输入矩阵2各个数值 } for(int j=0;j<r2;j++) { for(int i=0;i<c2;i++) cout<<s2[j][i]<<'\t'; //输出矩阵2各个数值 cout<<endl; } if(r1==r2&&c1==c2) { cout<<"矩阵相加输出为:"<<endl; for(int i=0;i<r1;i++) { for(int j=0;j<c1;j++) { if(isnum(s1[i][j])&&isnum(s2[i][j])) //判断字符串为整型数值后 { int a=string2int(s1[i][j]); int b=string2int(s2[i][j]); a=a+b; //数值相加 s3[i][j]=int2string(a); } else { s3[i][j]=s1[i][j]+"+"+s2[i][j]; //非整型数值时进行字符相加 } cout<<s3[i][j]<<'\t'; //相加后直接进行输出矩阵数值 } cout<<endl; } cout<<"矩阵相减输出为:"<<endl; for(int i=0;i<r1;i++) { for(int j=0;j<c1;j++) { if(isnum(s1[i][j])&&isnum(s2[i][j])) //进行字符串是否为整型数值判断 { int a=string2int(s1[i][j]); int b=string2int(s2[i][j]); a=a-b; //数值相减 s3[i][j]=int2string(a); } else { s3[i][j]=s1[i][j]+"-"+s2[i][j]; //进行字符相减即变元相减 } cout<<s3[i][j]<<'\t'; } cout<<endl; } if(r1==c1) { cout<<"矩阵相乘(数乘)输出为:"<<endl; for(int i=0;i<r1;i++) { for(int j=0;j<c1;j++) { if(isnum(s1[i][j])&&isnum(s2[i][j])) { int a=string2int(s1[i][j]); int b=string2int(s2[i][j]); a=a*b; //进行数值相乘 s3[i][j]=int2string(a); } else { s3[i][j]=s1[i][j]+"*"+s2[i][j]; } cout<<s3[i][j]<<'\t'; } cout<<endl; } string s; cout<<"矩阵相乘(点乘)输出为:"<<endl; for(int i=0;i<r1;i++) { for(int j=0;j<c2;j++) { s=""; for(int k=0;k<c1;k++) { s=s+s1[i][k]+"*"+s2[k][i]+"+"; } s.erase(s.end()-1); cout<<s<<'\t'; } cout<<endl; } } return 1; } else if(c1==r2&&r1!=c1) { string s; cout<<"矩阵相乘(点乘)输出为:"<<endl; for(int i=0;i<r1;i++) { for(int j=0;j<c2;j++) { s=""; for(int k=0;k<c1;k++) { s=s+s1[i][k]+"*"+s2[k][i]+"+"; } s.erase(s.end()-1); cout<<s<<'\t'; } cout<<endl; } return 1; } else { cout<<"你的输入有误,请重新输入!!!"<<endl; return 0; } } int bianyuans() { int n=0; cout<<"变元矩阵运算(数值可为单个字符多个字符和数字)"<<endl; do{ cout<<"请输入第一个矩阵行数和列数:"<<endl; int r1,c1; cin>>r1>>c1; cout<<"请输入第二个矩阵行数和列数:"<<endl; int r2,c2; cin>>r2>>c2; n=shuchu(r1,c1,r2,c2); }while(n==0); return 6; }
xiangliangs.cpp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int xiangliangs() { int p=0; double s1[3][3]; double s2[4][4]; do { cout<<"请输入方阵行列数(3或4):"<<endl; cin>>p; if(p==3) { Matrix3d A; //定义3*3 double 型矩阵 cout<<"请输入矩阵各个数值:"<<endl; for(int i=0;i<p;i++) { for(int j=0;j<p;j++) cin>>s1[i][j]; } A << s1[0][0],s1[0][1],s1[0][2], s1[1][0],s1[1][1],s1[1][2], s1[2][0],s1[2][1],s1[2][2]; cout << "A矩阵显示:" << endl << A << endl << endl; EigenSolver<MatrixXd> es(A); cout << "A的特征值为:" << endl << es.eigenvalues() << endl; MatrixXcd vect = es.eigenvectors();//特征向量矩阵 cout << "特征向量复数形式输出:" << endl << vect << endl; p=1; } if(p==4) { MatrixXd A(4,4); cout<<"请输入矩阵各个数值:"<<endl; for(int i=0;i<p;i++) { for(int j=0;j<p;j++) cin>>s2[i][j]; } A << s2[0][0], s2[0][1], s2[0][2],s2[0][3], s2[1][0], s2[1][1], s2[1][2],s2[1][3], s2[2][0], s2[2][1], s2[2][2],s2[2][3], s2[3][0], s2[3][1], s2[3][2],s2[3][3]; cout << "A矩阵显示:" << endl << A << endl << endl; EigenSolver<MatrixXd> es(A); cout << "A的特征值为:" << endl << es.eigenvalues() << endl; MatrixXcd vect = es.eigenvectors();//特征向量矩阵 cout << "特征向量复数形式输出:" << endl << vect << endl; p=1; } else { //cout<<"输入有误,请重新输入!!!"<<endl; break; } }while(p==0); return 7; }