有关矩阵的一些问题
首先谈到矩阵,那么就会想到线性代数,但我太蒟蒻了,所以并不想谈那么深,所以就只说说其中一部分;
首先说初等行变换:
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 ,则我们称B是A的逆矩阵,其中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");
}
}
}

浙公网安备 33010602011771号