• 浅谈矩阵


          矩阵乘法及矩阵快速幂

      参考:矩阵快速幂基础讲解       理解矩阵乘法

      定义:由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。记作:

           这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数 aij为(i,j)元的矩阵可记为(aij)或(aij)m × n,m×n矩阵A也记作Amn

         元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵 。

       基本算法:

        加法/减法:用于同型矩阵,不同矩阵的相同位置相加减

               

                             

        数乘:矩阵中的每一个数乘那个数,得到新的矩阵

            

          矩阵的加、减、数乘合称矩阵的线性运算(好像跟向量的加、减、数乘差不多)

        转置:把矩阵A的行和列互相交换所产生的矩阵称为A的转置矩阵,这一过程称为矩阵的转置

                        

           矩阵的转置满足以下运算律:

                        

        共轭:矩阵的共轭定义为:.一个2×2复数矩阵的共轭如下所示:

        共轭转置:矩阵的共轭转置定义为:,也可以写为:。一个2×2复数矩阵的共轭如下所示:

        乘法:两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵,它的一个元素:并将此乘积记为:

          满足的运算律: 结合律:A*(B*C) = (A*B)*C

                  分配律:A*(B+C) = A*B+A*C

        分配律若满足(A+B)*C,则不满足C*(A+B)

                (矩阵乘法不满足交换律)

           矩阵乘法证明过程参考:http://www.ruanyifeng.com/blog/2015/09/matrix-multiplication.html

      接下来,放代码:

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define M 5005
    using namespace std;
    int n, m, l, p;
    int a[M][M], b[M][M];
    int c[M][M];
    
    void add() {  //矩阵a、b应为同型矩阵
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                c[i][j] = a[i][j] + b[i][j];  //减法只需将‘+’改为‘-’
    }
    
    void mul() { //矩阵乘法
        for(int i = 1; i <= n; ++i)
            for(int k = 1; k <= m; ++k) {
                int r = a[i][k];
                for(int j = 1; j <= l; ++j)
                    c[i][j] += r * b[k][j];
            }
        /*
        另一种写法 
      若把三重循环中的i,j,k枚举顺序交换,速度可能慢几倍
        for(int i=1;i<=h;i++)
            for(int j=1;j<=l;j++)
                for(int k=1;k<=ll;k++)
                    c[i][k] += a[i][j] * b[j][k];
        */
    }
    
    // 矩阵快速幂 
    struct Mat {
        ll m[101][101];
    } a, e;
    
    Mat Mul(Mat x, Mat y) {
        Mat c;
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                c.m[i][j] = 0;
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                for (int k = 1; k <= n; ++k)
                    c.m[i][j] = c.m[i][j] % mod + x.m[i][k] * y.m[k][j] % mod;
        return c;
    }
    
    Mat pow(Mat x, ll y) {
        Mat ans = e;
        while (y) {
            if (y & 1) ans = Mul(ans, x);
            x = Mul(x, x);
            y >>= 1;
        }
        return ans;
    }
    // 
    
    int main() {
        scanf("%d%d%d", &n, &m, &l);
        /*
        输入 
        */
        return 0;
    }
  • 相关阅读:
    Java并发之ThreadPoolExecutor
    Java并发之同步工具类
    em和i , b和Strong 的区别
    OS应用架构谈(二):View层的组织和调用方案(中)
    iOS应用架构谈(二):View层的组织和调用方案(上)
    java(List或Array数组)求交集、并集、差集, 泛型工具类
    AES/DES 可逆性加密算法 -- java工具类
    用xtrabackup实现mysql的主从复制 阿里云rds到自己创建mysql
    java 生成二维码工具
    XDU 1022 (数论筛法+前缀和)
  • 原文地址:https://www.cnblogs.com/v-vip/p/9185288.html
Copyright © 2020-2023  润新知