矩阵

矩阵

定义

\(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~~

posted @ 2018-10-16 21:10  Kylin_Seven  阅读(185)  评论(0编辑  收藏  举报