首页 > 其他分享 >矩阵乘法

矩阵乘法

时间:2022-11-30 22:36:19浏览次数:29  
标签:le 矩阵 times Fib 递推 operatorname 乘法

矩阵乘法

定义,设A是\(m\times n\)矩阵,B是\(n \times p\)矩阵,则\(C=A\times B\)是一个\(m\times p\)矩阵

性质:

\(A\times B\)不一定等于\(B\times A\),

\((A\times B) \times C=A\times (B\times C)\),

\((A+B) \times C=A\times C+B\times C\)

定义,设\(C=A\times B\),A是\(m\times n\)矩阵,B是\(n \times p\)矩阵,

\[C_{i,j}=\sum_{1\le k\le n}\left(A_{i,k}\times B_{k,j}\right)\text{,其中}(1\le i \le m,1\le j \le p) \]

for(int i=1;i<=m;i++)
    for(int j=1;j<=p;j++)
        for(int k=1;k<=n;k++)
            c[i][j]+=a[i][k]*b[k][j];

考虑一种特殊情形,矩阵\(F\times Q\),其中\(Q\)是\(n\times n\)矩阵,\(F\)是\(1\times n\)矩阵
若是设\(F'=F\times Q\),则\(F'[i]=\sum_{k=1}^nF[k]\times Q[k,i]\),这里可以将其看作\(F\)中的第\(k\)个值会对\(F'\)中的第\(i\)个值产生线性递推关系

列如\(\operatorname{Fib}数列\),因为\(\operatorname{Fib}_n=\operatorname{Fib}_{n-1}+\operatorname{Fib}_ {n-2}\),则我们可以构建矩阵
\(F_n=[\operatorname{Fib}_n,\operatorname{Fib}_{n+1}]\)
矩阵\(A=\begin{bmatrix}0 & 1 \\ 1 & 1\\ \end{bmatrix}\)

则\(F_n\times A=[\operatorname{Fib}_{n+1},\operatorname{Fib}_n+\operatorname{Fib}_{n+1}]=[\operatorname{Fib}_{n+1},\operatorname{Fib}_{n+2}]=F_{n+1}\)
由此可见\(F_i\times A=F_{i+1}\)。故\(F_0\times A^n=F_n\),此时可以由快速幂计算\(A^n\)以达到用矩阵乘法加速递推的效果

我们定义\(F\)为状态矩阵,\(A\)为转移矩阵,满足以下条件的就可以考虑矩阵乘法加速

  1. \(F\)的每次递推是一个线性的,简单的递推关系
  2. \(F\)是一个简单的一维向量,该向量在每个时间单位发生一次变化
  3. 关于\(F\)的递推式始终不变
  4. 递推轮数很长但其实\(F\)的长度(每次转移时的有效长度)不大

\(A\)的构造方法:如果递推式中含有\(F_{i+1}[y]+=F_i[x]\times b,b\in \mathbb{Z}\),则将\(A\)的第\(x\)行第\(y\)列赋值为\(b\)
当涉及到\(F_{i+1}[y]+=c\),\(c\)是一个固定常量,则我们可以考虑给\(A\)增加一个第\(0\)行,具体地把\(F[0]\)用起来设置\(F[0]=1\),然后\(A[0][y]\)赋值为\(c\)即可

标签:le,矩阵,times,Fib,递推,operatorname,乘法
From: https://www.cnblogs.com/oierpyt/p/16939969.html

相关文章

  • 差分矩阵
    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。每个操作......
  • 高精度乘法
    给定两个非负整数,请你计算它们的值。#include<iostream>#include<vector>usingnamespacestd;vector<int>a,b,c;voidmul(){intm=a.size(),n=b.......
  • 爱生气的书店老板 二维区域和检索 - 矩阵不可变 元素和为目标值的子矩阵数量
    1052.爱生气的书店老板思路,把老板不生气时候的值都加起来,同时让当前值为零;最后,按照最长时间滑动窗口,求解窗口最大值,与上值相加即可intsum=0;for(inti=0;i<cu......
  • python打印99乘法表
    #使用while嵌套循环打印99乘法表#外层循环表示行i=1whilei<=9:j=1whilej<=i:#\t表示对其,end=""表示不换行print(f"{j}*{i}={i*j}\t"......
  • 【C语言基础】C语言实现矩阵相乘
    前言最近在考虑如何实现kalman跟踪,其中涉及较多矩阵运算,比如矩阵相乘、矩阵转置等,先实现了一个矩阵相乘的c代码如下。其实,后续可以使用matrix类实现kalman跟踪。code#......
  • 力扣240(java&python)-搜索二维矩阵 II(中等)
    题目:编写一个高效的算法来搜索 m x n 矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例......
  • 螺旋矩阵II-LeetCode59 考验代码能力
    力扣链接:https://leetcode.cn/problems/spiral-matrix-ii/题目  给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn 正方......
  • 高精度乘法模板(大*大)
    高精度乘法模板(大*大)#include<bits/stdc++.h>usingnamespacestd;vector<int>mul(vector<int>&A,vector<int>&B){ vector<int>C(A.size()+B.size()+7,......
  • 大整数的乘法
    大整数的乘法(这里主要讨论的是两个较大的数相乘的效率问题,实际上并不是真正意义上的大数相乘。在java中有个BigInteger类已经可以储存大数,并提供了大数相乘的方法了。)【分析......
  • 蛇形填数(矩阵)
    蛇形填数      在nxn方针里填入1,2,...,nxn,要求填成蛇形。例如:n=4时方阵为:10111219  161328  151437    6  54上面的方阵中,多余的空格只......