矩阵
矩阵
定义
\(a[n][m]\)表示一个\(n\)行\(m\)列的矩阵
\(1\)行\(m\)列的矩阵称为行向量,列向量同理。
对角矩阵:除了主对角线上的元素外其他元素全部为零的矩阵。
上三角矩阵:主对角线一下全部为零的矩阵。
单位矩阵:主对角线上的元素全部为1 ,其他为0的矩阵。
矩阵乘法
\(a[n][m]*b[m][p]=c[n][p]\)。矩阵乘法满足结合律,不满足交换律。
for(int i=1;i<=n;++i)
for(int j=1;j<=p;++j)
for(int k=1;k<=m;++k)
c[i][j]+=a[i][k]*b[k][j];
矩阵快速幂
与普通的快速幂相同,只不过是矩阵相乘。一开始需要建一个单位矩阵。
int n;
int a[maxn][maxn];//原矩阵
int x[maxn][maxn];//中间转移矩阵
int ans[maxn][maxn];//答案矩阵
void _ans(){
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
x[i][j]=ans[i][j],ans[i][j]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
ans[i][j]+=a[i][k]*x[k][j];
}
void _x(){
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
x[i][j]=a[i][j];
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k)
a[i][j]+=x[i][k]*x[k][j];
}
void quick_pow(int k){
for(int i=1;i<=n;++i) ans[i][i]=1;//单位矩阵
while(k){
if(k&1) _ans();
_x();
k>>=1;
}
}
矩阵加速
矩阵加速一般用于求线性方程的第\(n\)项值。根据题目给出的递推式,列一个\(1*x\)的矩阵\(x[~]\),使得\(x[~]*A=x'[~]\)。\(A\)即为所求。
至于怎么求,按照定义列方程组即可。
求出矩阵\(A\)后,根据结合律,即可用矩阵快速幂快速求解。
高斯消元
运用小学数学解方程组的思想解方程组。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
double map[111][111],ans[111],eps=1e-7;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&map[i][j]);
for(int i=1,r;r=i,i<=n;i++){//消第i行
for(int j=i+1;j<=n;j++)//找第i个未知数的系数最大的一行
if(fabs(map[r][i])<fabs(map[j][i])) r=j;
if(fabs(map[r][i])<eps){
printf("No Solution");return 0;
}
if(i!=r) swap(map[r],map[i]);
double div=map[i][i];
for(int j=i;j<=n+1;j++) map[i][j]/=div;//将第i行第i列的系数消成1
for(int j=i+1;j<=n;j++){//消下面的每一行
div=map[j][i];
for(int k=i;k<=n+1;k++)
map[j][k]-=map[i][k]*div;
}
}
ans[n]=map[n][n+1];
for(int i=n-1;i>=1;i--){
ans[i]=map[i][n+1];
for(int j=i+1;j<=n;j++)
ans[i]-=(map[i][j]*ans[j]);
}
for(int i=1;i<=n;i++)
printf("%0.2lf\n",ans[i]);
return 0;
}
欢迎指正评论O(∩_∩)O~~