• 矩阵


    矩阵

    定义

    (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
    ",ans[i]);
      	return 0;
    }
    

    欢迎指正评论O(∩_∩)O~~

  • 相关阅读:
    【2020-07-04】人生十三信条
    【2020-07-03】人生十三信条
    【2020-07-02】人生十三信条
    【2020-07-01】人生十三信条
    【一句日历】2020年7月
    团队第三次作业评分 需求规格说明书
    软工评分工具
    中期成绩汇总
    软件工程第四次作业评分
    软件工程第五次作业评分
  • 原文地址:https://www.cnblogs.com/kylinbalck/p/9800689.html
Copyright © 2020-2023  润新知