用c++程序实现线代运算
线性代数各种运算感觉超级繁琐,让人cpu疼,为保证运算结果的准确性,献上这个这个可爱的c++程序帮助你我他!直接运行,然后根据提示就可以实现你想要执行的操作了!真的很方便。。。
程序中可直接调用的函数列表
//求矩阵det的逆
vector<vector<double> > getInvese(vector<vector<double> > det) ;
//获得det[i][j]余子式行列式
vector<vector<double> > getComplementMinor(vector<vector<double> > det,int i,int j) ;
//获得行列式det的值
double getDetVal(vector<vector<double> > det);
//输出行列式det
void outputMatrix(vector<vector<double> > matrix);
//创建并输入一个矩阵 matrix
vector<vector<double> > createMatrix();
//返回矩阵matrix1矩阵matrix2的结果matrix3
vector<vector<double> > multiply(vector<vector<double> > matrix1,vector<vector<double> > matrix2);
带注释的完整源代码
#include<bits/stdc++.h>
using namespace std;
//求矩阵det的逆
vector<vector<double> > getInvese(vector<vector<double> > det) ;
//获得det[i][j]余子式行列式
vector<vector<double> > getComplementMinor(vector<vector<double> > det,int i,int j) ;
//获得行列式det的值
double getDetVal(vector<vector<double> > det);
//输出矩阵matrix
void outputMatrix(vector<vector<double> > matrix);
//创建并输入一个矩阵 matrix
vector<vector<double> > createMatrix();
//返回矩阵matrix1矩阵matrix2的结果matrix3
vector<vector<double> > multiply(vector<vector<double> > matrix1,vector<vector<double> > matrix2);
int main()
{
while(1)
{
cout<<" 1.求矩阵的逆"<<endl;
cout<<" 2.求矩阵对应行列式的值"<<endl;
cout<<" 3.两矩阵相乘"<<endl;
cout<<" 0.结束"<<endl;
cout<<" 输入你想执行操作的编号:";
int flag=0;
cin>>flag;
if(flag ==0)
{
break;
}else if(flag == 1)
{
cout<<" 该矩阵的逆为:"<<endl;
vector<vector<double> >matrix = createMatrix();
outputMatrix(getInvese(matrix));
}else if(flag == 2)
{
vector<vector<double> >matrix = createMatrix();
cout<<" 该行列式的值为:";
cout<<getDetVal(matrix);
}else if(flag == 3)
{
cout<<" 接下来创建两个矩阵"<<endl;
vector<vector<double> >matrix1 = createMatrix();
vector<vector<double> >matrix2 = createMatrix();
cout<<" 结果为:"<<endl;
outputMatrix(multiply(matrix1,matrix2));
}
cout<<endl<<endl;
}
}
//求矩阵det的逆
vector<vector<double> > getInvese(vector<vector<double> > det)
{
int n=det.size(),m=det[0].size();//n为det的行,m为det的列;
if(n != m)
cout<<" 您输入的矩阵不是方阵!求么子逆!";
double detVal = getDetVal(det);//获得矩阵det行列式的值
vector<vector<double> > ans(n);//保存det的伴随矩阵
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
//获得伴随矩阵相应位置的代数余子式的值
double t = pow(-1,i+j)*getDetVal(getComplementMinor(det,j,i)) ;
//这里i,j的顺序要注意——注意代数余子式在伴随矩阵上的位置
ans[i].push_back(t/detVal);
}
return ans;
}
//获得det[i][j]余子式行列式
vector<vector<double> > getComplementMinor(vector<vector<double> > det,int i,int j)
{
int n=det.size(),m=det[0].size();//n为det的行,m为det的列;
vector<vector<double> > ans(n-1);//保存获得的结果
for(int k=0;k<n-1;k++)
for(int l=0;l<n-1;l++)
{
ans[k].push_back(det[k<i?k:k+1][l<j?l:l+1]);
}
return ans;
}
double getDetVal(vector<vector<double> > det)
{
double ans=0;
int n=det.size(),m=det[0].size();//n为det的行,m为det的列;
if(n != m)
{
cout<<" 您输入的矩阵不是方阵!求么子行列式!";
exit(1);
}
if(det.size() == 1)
return det[0][0];
for(int i=0;i<m;i++)
{
ans+=det[0][i] * pow(-1,i)*getDetVal(getComplementMinor(det,0,i));
}
return ans;
}
//输出矩阵matrix
void outputMatrix(vector<vector<double> > matrix)
{
int m=matrix.size(),n=matrix[0].size();
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cout<<matrix[i][j]<<" ";
cout<<endl;
}
}
//创建并输入一个矩阵 matrix
vector<vector<double> > createMatrix()
{
cout<<" 分别输入矩阵的行,列:";
int n = 3,m=3;cin>>n>>m;
vector<vector<double> > matrix(n);
cout<<" 输入矩阵:\n";
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
double t ;
cin >> t;
matrix[i].push_back(t);
}
return matrix;
}
//返回矩阵matrix1乘矩阵matrix2的结果matrix3
vector<vector<double> > multiply(vector<vector<double> > matrix1,vector<vector<double> > matrix2)
{
if(matrix1[0].size()!=matrix2.size())
{
cout<<" 这两个矩阵不能相乘";
exit(1);
}
int n = matrix1.size(),m=matrix2[0].size();
int l =matrix2.size();
vector<vector<double> > matrix3(n);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
double t =0;
for(int k=0;k<l;k++)
{
t+=matrix1[i][k]*matrix2[k][j];
}
matrix3[i].push_back(t);
}
return matrix3;
}
操作说明
主函数已经定义了四个常见的操作,按提示输入数字即可;当然也可自己根据函数名执行新的操作
各操作算法说明
详细算法烦请移步之前三篇博客中:
行列式求值:线性代数求行列式的值(用C++程序轻松解决)
矩阵乘法:线性代数矩阵乘法用C++代码实现
矩阵求逆:c++程序助你轻松求矩阵的逆