【墨鳌】【逆矩阵】【行列式】

概念

先版个板子

#include <bits/stdc++.h>
using namespace std;

class Matrix{
private:
	vector<vector<double>>a;

public:		
	void show(){				
		for(auto row:a){
			for(auto v:row)
				cout<<v<<" ";
			cout<<endl;
		}
	}
	
	int cols(){
		return a.size();
	}
	
	int rows(){
		return a[0].size();
	}
	
	int get(int x,int y){
		return a[x][y];
	}
	
	void set(int x,int y,int val){
		a[x][y]=val;
	}
	
	// 空矩阵 
	Matrix(int n,int m):a(n,vector<double>(m,0)){
		
	}
	
	// 单位矩阵 
	Matrix(int n):a(n,vector<double>(n,0)){
		for(int i=0;i<n;i++)a[i][i]=1;
	}
	
	// 拷贝构造 
	Matrix(vector<vector<double>>&b){
		int n=b.size(),m=b[0].size();
		a=vector<vector<double>>(n,vector<double>(m,0));
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				if(b[i][j])a[i][j]=b[i][j];
	}
	
	// 代数余子式 A(i,j) 
	Matrix remove(int x,int y){
		int n=rows()-1,m=cols()-1;
		Matrix B(n,m);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				B.set(i,j,get(i+(i>=x),j+(j>=y)));
		return B;
	}
	
	// 矩阵转置 
	Matrix T(){
		int n=cols(),m=rows();
		Matrix B(n,m);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				B.set(i,j,get(j,i));
		return B;
	}
	
	// 矩阵数乘 
	void mul(double x){
		for(auto&row:a)for(auto&v:row)v*=x;
	}
};



// 求行列式 n ×n 
double det(Matrix A){
	int n=A.rows();
	if(n==1)return A.get(0,0);
	double sum=0;
	for(int j=0;j<n;j++)
		sum+=A.get(0,j)*det(A.remove(0,j))*(j%2?-1:1); 
	return sum;
}

// 矩阵乘法 
Matrix multiply(Matrix&A,Matrix&B){
	int n=A.rows(),m=B.cols();
	Matrix C(n,m);
	int K=A.cols()!=B.rows()?-1:A.cols();
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			for(int k=0;k<K;k++)
				C.set(i,j,C.get(i,j)+A.get(i,k)*B.get(k,j));
	return C;			
}

Matrix company_matrix(Matrix&A) {
	int n=A.cols();
	Matrix B(n,n);
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			B.set(j,i,det(A.remove(i,j))*((i+j)%2?-1:1));
	return B;
}

int main(){
	vector<vector<double>> mat1{
		{5,0,0,-3},
		{0,3,1,0},
		{0,4,-2,0},
		{1,0,0,2}
	};
	Matrix A(mat1);
	puts("矩阵A");
	A.show();
	cout<<endl;
	
	Matrix A1=company_matrix(A);
	puts("伴随矩阵");
	A1.show();
	cout<<endl;
	
	double detA=det(A);
	cout<<"det A = "<<detA<<endl;
	cout<<endl;
	
	Matrix I=multiply(A,A1);
	I.mul(1.0/detA);
	I.show();
	cout<<endl;
	//cout<<det(A)<<endl;
	return 0;
} 
posted @ 2022-06-01 15:07  墨鳌  阅读(180)  评论(0编辑  收藏  举报