有关矩阵的一些问题

首先谈到矩阵,那么就会想到线性代数,但我太蒟蒻了,所以并不想谈那么深,所以就只说说其中一部分;

首先说初等行变换

  1.用一个非0的数乘某一行

  2.把其中一行的若干倍加到另一行上;

  3.交换两行的位置;

当然,初等列变换的定义与初等行变换的定义类似,这里便不多说了;

 

接着说高斯消元:

  一个矩阵通过初等变换后所能得到的矩阵叫做增广矩阵。

  我们把阶梯型增广矩阵变换为简化形阶梯矩阵的过程就是高斯消元;

  基本思想:对于一个未知量xi,找到一个xi的系数非0,但x1~xi-1的系数都是零的方程,然后用初等行变换把其他方程的xi的系数全部消成0;

  在高斯消元完成后,若存在系数都是0,但常数不是0的情况,方程无解;

  🐖元(主元):系数不全为0的行的个数就是主元的个数;

  自由元:系数全为0,常数也是0的个数就是自由元的个数;

  通常情况下:一道题并不会直接给出n个n元一次方程组。如果给了n+1个二元方程组,那么我们可以通过相邻两个方程做差,把它变成n个n元一次方程组,然后进行高斯消元求解;

  

#include <bits/stdc++.h>
#define eps 1e-8
using namespace std;
double a[101][102];
int n;
bool GUASS()
{
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			if(fabs(a[j][i])>eps){
				for(int k=1;k<=n;k++){
					swap(a[i][k],a[j][k]);
				}
				swap(a[i][n+1],a[j][n+1]);
				break;
			}			
		}
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			double tmp=a[j][i]/a[i][i];
			for(int k=i;k<=n;k++){
				a[j][k]-=a[i][k]*tmp;
			}
			a[j][n+1]-=a[i][n+1]*tmp;
		}
	}
	for(int i=1;i<=n;i++){
		bool lala=0;
		for(int j=1;j<=n;j++){
			if(a[i][j]!=0){
				lala=1;
			}
		}
		if(lala==0){
			cout<<"No Solution";
			return 0;
		}
	}
	return 1;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n+1;j++){
			scanf("%lf",&a[i][j]);
		}
	}
	if(GUASS()){
		for(int i=1;i<=n;i++){
			printf("%.2lf\n",a[i][n+1]/a[i][i]);
		}
	}
}

 

然后说一下矩阵的逆:

  单位矩阵:主对角线的元素都是1,其余所有元素都是0;

  矩阵的逆,故名思意,就是矩阵的逆元啊~(这思不出来吧?),而逆元的作用便是化除法为乘法;

  注意:一个存在逆矩阵的矩阵叫做可逆矩阵;AB=BA=E ,则我们称BA的逆矩阵,其中E是单位矩阵;

  特点:一个可逆矩阵,它的逆矩阵是唯一的;

  条件:可逆矩阵一定是正方形,两个可逆矩阵的乘积依然可逆。

  作用:求X=A/B; (X*B=A,X*B*B的逆矩阵=A*B的逆矩阵,X=A*B的逆矩阵);(任何矩阵*单位矩阵=单位矩阵)

  方法:在读入的n阶矩阵右侧加入一个n阶单位矩阵,然后做高斯消元,使读入的n阶矩阵化为n阶单位矩阵,此时右面加入的矩阵就为所求的逆。

 

#include <bits/stdc++.h>
#define p 1000000007
#define inc(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
int n;
int a[1000][1000];
long long KSM(long long a,long long b)
{
	long long res=1;
	while(b){
		if(b&1) res=res*a%p;
		a=a*a%p;
		b/=2;
	}
	return res%p;
}
int Gauss()
{
	inc(i,1,n){
		inc(j,i,n) if(a[j][i]) {swap(a[j],a[i]);break;}
		if(a[i][i]==0){cout<<"No Solution"; return 0;}
		long long tmp=KSM(a[i][i],p-2);
		inc(j,i,2*n) a[i][j]=a[i][j]*tmp%p;
		inc(j,1,n){
			if(i==j) continue;
			long long tmp2=a[j][i]%p;
			inc(k,i,2*n) a[j][k]=(a[j][k]-tmp2*a[i][k]%p+p)%p;
		}
	}
	return 1;
}
int main()
{
	cin>>n;
	inc(i,1,n){
		inc(j,1,n) scanf("%d",&a[i][j]);
		a[i][i+n]=1;
	}
	if(Gauss()){
		inc(i,1,n){
			inc(j,n+1,2*n){
				printf("%d ",a[i][j]);
			}
			printf("\n");
		}
	}
} 

 

posted @ 2019-10-10 07:56  神之右大臣  阅读(639)  评论(0)    收藏  举报