线性代数行列式求值/矩阵相乘/求矩阵的逆,一个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++程序助你轻松求矩阵的逆

猜你喜欢

转载自blog.csdn.net/qq_45768060/article/details/105630675