矩阵

矩阵

定义

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

转载于:https://www.cnblogs.com/kylinbalck/p/9800689.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值