矩阵乘法

从0开始学算法--数学(4.1矩阵)

为君一笑 提交于 2019-12-02 03:02:46
1,概念 以下词条解释来自百度百科:代数,代数系统,线性代数,矩阵 代数   代数是研究数、数量、关系、结构与代数方程(组)的通用解法及其性质的数学分支。 初等代数 一般在中学时讲授,介绍代数的基本思想:研究当我们对数字作加法或乘法时会发生什么,以及了解变量的概念和如何建立 多项式 并找出它们的根。代数的研究对象不仅是数字,而是各种抽象化的结构。在其中我们只关心各种关系及其性质,而对于“数本身是什么”这样的问题并不关心。常见的代数结构类型有群、 环 、域、模、 线性空间 等。 代数系统   非空集合A和A上k个一元或二元运算f1,f2,…,fk组成的系统称为一个代数系统,简称代数,记作(A,f1,f2,…,fk)。由定义可知,一个代数系统需要满足下面3个条件:(1)有一个非空集合A;(2)有一些建立在集合A上的运算;(3)这些运算在集合A上是封闭的。有的书上对代数系统定义时不要求运算的封闭性,而是把具有封闭性的代数系统定义为一个新的概念- 广群 。 线性代数   线性代数是数学的一个分支,它的研究对象是 向量 , 向量空间 (或称线性空间), 线性变换 和有限维的 线性方程组 。向量空间是 现代数学 的一个重要课题;因而,线性代数被广泛地应用于 抽象代数 和 泛函分析 中;通过解析几何,线性代数得以被具体表示。线性代数的理论已被泛化为算子理论。由于科学研究中的 非 线性模型

矩阵乘法与邻接矩阵

不羁的心 提交于 2019-12-02 02:37:21
矩阵乘法与邻接矩阵 引例 \(1:\) [TJOI2017]可乐 相信很多人都能想出一个 \(\Theta(t\times m)\) 的做法.(虽然我没想出来,但这只是因为我菜) 问题简化一下,如果我们没有在原地停留和自爆两个操作,那么就是问从起点出发,走 \(t\) 步的不同路径数. 这个问题怎么做呢? 不考虑 \(Dp\) . 令该图的邻接矩阵是 \(G\) , 那么我们考虑 \(G^2\) 是个什么东西.(此处的幂运算是指矩阵的幂). 我们单独考虑某一行和某一列的相关运算 \(:\) 令其为 \(G_{a,i}\) 和 \(G_{i,b}\) , 令 \(G'\) 为相乘得到的矩阵,那么会有 \(:\) \[G'_{a,b} = \sum_{i=1}^m{G_{a,i}\times G_{i,b}}\] 容易发现,当且仅当 \(G_{a,i}\) 和 \(G_{i,b}\) 都不为零,即 \(i\) 点可连通 \(a,b\) 两点的时候上式的该项才为 \(1\) , 否则为零. 那么所有的这些情况累加起来,就是从 \(a\) 到 \(b\) 长度为 \(2\) 的路径条数.(即走 \(2\) 步从 \(a\) 走到 \(b\) 的方案数,长度是 \(2\) 是因为经过一个中间点.) 由此,我们可以得到, \(G^2\) 得到的矩阵其实表示了任意两点间长度为 \(2\)

03-乘法和逆矩阵

a 夏天 提交于 2019-12-02 02:16:48
一、矩阵乘法   矩阵乘法有下面的理解:   两个矩阵相乘=第三个矩阵,即$A*B=C$,我们可以理解为矩阵$A$与矩阵$B$的每一列相乘($A$的各列的线性组合=$C$中的某一列),得到矩阵$C$的每一列   也可以这么理解,矩阵$C$中的每个元素$c_{ij}$来自矩阵$A$的第i行和矩阵$B$的第j列点乘:  第三种理解:以行为单位,$A$中某一行与矩阵$B$整体相乘(即矩阵$B$各行的线性组合结果)= 矩阵$C$中某一行   第四种就是列×行,即$A$中各列×$B$中各行:   当然也可以将矩阵$A$和$B$进行分块相乘: 二、逆矩阵   这里讨论方阵,先说不可逆的情况(这里先举个例子,下面的示例矩阵不可逆): $\left|\begin{array}{lll}{1} & {3} \\ {2} & {6}\end{array}\right|$   解释:如果某个矩阵的列向量的线性组合可以得到0向量,那么该矩阵不可逆   OK,我们知道了某矩阵存在可逆矩阵,那么如何求出来逆矩阵呢?如 $\left[\begin{array}{ll}{1} & {3} \\ {2} & {7}\end{array}\right]$  我们将逆矩阵用未知变量填充:  根据之前所将,矩阵乘法可以理解为矩阵$A$与逆矩阵$A^{-1}$的第一列相乘得到$I$的第一列,矩阵$A$与逆矩阵$A^{-1}

AES 加密算法的原理详解

本秂侑毒 提交于 2019-12-02 01:56:27
AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分。 AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义: · 明文P 没有经过加密的数据。 · 密钥K 用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。 · AES加密函数 设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。 · 密文C 经加密函数处理后的数据 · AES解密函数 设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

倍增&矩阵乘法 专题复习

柔情痞子 提交于 2019-12-01 22:57:03
倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取 \(max\) ,然后都一样。。。 据神仙LBC说:这不显然是对的吗! \[ \ \] \[ \ \] [usaco2007 Nov] relays 奶牛接力跑 离散一下,然后套矩阵乘法 \(a[i][j]\) 记录从 \(i\) 出发到 \(j\) 的最小答案,快速幂即可 const int N=410,P=1e4+7; int n,m,s,t; int a[N],b[N],c[N]; int h[N],cnt; inline void chk(ll &a,ll b) { ((a>b)&&(a=b)); } struct Mat{ ll a[N][N]; void init(){ memset(a,63,sizeof a); } Mat operator * (const Mat x) const { Mat res; res.init(); rep(i,1,cnt) rep(j,1,cnt) rep(k,1,cnt) chk(res.a[i][k],a[i][j]+x.a[j][k]); return res; } } res,x; int main() { n=rd(),m=rd(),s=rd(),t=rd(); rep(i,1,m) { c

深度解析卡尔曼滤波在IMU中的使用

泪湿孤枕 提交于 2019-12-01 21:52:13
卡尔曼滤波主要分两个步骤,预测加校正。预测是基于上一时刻的状态对当前状态进行估计,校正是根据当前状态的观测与上一时刻的估计进行综合分析,估计出系统的最优状态值,然后下一时刻接着重复这个过程;卡尔曼不断的进行迭代,它不需要大量的粒子状态输入,只需要过程量,因此它的速度很快,非常适合线性系统的状态估计。 众所周知卡尔曼滤波在处理 IMU 传感器数据融合中作用巨大,但在实际实现起来并非那么容易;本文从 MPU6050 入手,分析卡尔曼滤波的使用。 本篇文章需要你在夜深人静的时候、先去冲一杯咖啡、准备一张纸、一支笔…… 卡尔曼滤波 从来没有坐下来认真的计算卡尔曼滤波的公式由来以及它背后更深层次的原理,为什么在处理加速度以及陀螺仪的数据融合中卡尔曼滤波就那么的有效。但是对于大多数人来说,可能更感兴趣的是如何正确的去使用它,卡尔曼滤波的那五个公式到底怎么使用。 开始之前需要你具备一定的矩阵乘法、矩阵变换等知识,大家都知道矩阵乘法的重要性,不夸张的说,不懂矩阵乘法根本做不了复杂的模型。当然本篇涉及到的矩阵乘法没那么复杂,如果忘记了请翻大学时的课本脑补,或参考以下网站: http://en.wikipedia.org/wiki/Matrix_multiplication#Matrix_product_.28two_matrices.29 http://www.mathwarehouse.com

numpy学习总结

余生颓废 提交于 2019-12-01 20:21:49
numpy用法 导入: import numpy as np 生成矩阵: array = np.array([[1,2,3],[4,5,6]]) 矩阵维度: array.ndim 矩阵形状: array.shape 矩阵大小: array.size 矩阵元素类型: array.dtype 创建array a = np.array([1,2,3], dtype=np.int32) dtype:指定数据类型 矩阵维度:创建时方括号的层数代表矩阵的维度 常用用法 zero = np.zeros((2, 3)) 生成两行三列全为0的矩阵 one = np.empty((2, 3)) 生成两行三列全为1的矩阵 empty = np.empty((3, 2)) 生成三行两列全为接近于0但不是0的矩阵 e = np.arange(10) 此种用法与python中的range类似 h = np.arange(10).reshape(2, 4) 重新定义矩阵的形状 矩阵操作(要求:两个矩阵形状相同) arr1:矩阵1 arr2:矩阵2 加法:arr1 + arr2 按位相加 减法:arr1 - arr2 按位相减 乘法:arr1 * arr2 按位相乘 求幂:arr1 ** arr2 ****按位操作**** 除法:arr1 / arr2 按位相除 取余:arr1 % arr2 按位取余 取整

matlab学习笔记10 一般运算符

跟風遠走 提交于 2019-12-01 18:28:01
一起来学matlab-matlab学习笔记10 10_1一般运算符 觉得有用的话,欢迎一起讨论相互学习~ Follow Me 参考书籍 《matlab 程序设计与综合应用》张德丰等著 感谢张老师的书籍,让我领略到matlab的便捷 《MATLAB技术大全》葛超等编著 感谢葛老师的书籍,让我领略到matlab的高效 MATLAB语言以前是一种专门为进行矩阵计算所设计的语言,在以后的各个版本中逐步扩充其各种功能。现在MATLAB不仅仅局限于矩阵计算领域,但其最基本、最重要的功能还是进行实数矩阵和复数矩阵的运算。 在MATLAB中几乎所有的运算符和操作符都是以矩阵为基本运算单元的,这和其他计算机语言有很大不同,这也是MATLAB的重要特点 运算符 矩阵的逆 INV(X) 矩阵的转置 X' 矩阵的加减法 其基本形式为X+-Y,X和Y必须是同维度的矩阵,此时各对应元素相加减。如果X与Y的维数不同,则MATLAB将给出错误信息,提升用户两个矩阵的维数不匹配 X=[2 3; 4 5]; Y=[3 4; 4 3]; X+Y X-Y ans = 5 7 8 8 ans = -1 -1 0 2 矩阵的乘法 X*Y是两个矩阵X和Y的乘积,其中X和Y必须满足矩阵相乘的条件,即矩阵X的列数必须等于矩阵Y的行数。如果其中一个为1x1矩阵也合法,此时便是将每一个矩阵的元素都分别与这个数值相乘。 X=[2 3;

[国家集训队]矩阵乘法

断了今生、忘了曾经 提交于 2019-12-01 17:02:56
洛咕 题意:给定一个 \(N*N\) 的矩阵,每次询问一个子矩形内的第 \(K\) 小数. \(n<=500,Q<=500000.\) 分析:看到询问第 \(K\) 小就想到了整体二分.然后在二维平面上,用二维树状数组即可.所以就还是熟悉的模板题了. 本题有点小卡常,我连 \(register\) 都用上了,然后把 \(else\) 全都换成了 \(if\) ,然后能不写函数就不写函数.( \(PS:\) 其实这题不卡常的,是我刚开始写法丑陋,树状数组写了个 \(lowbit\) 函数,每个大的点将近满了 \(0.4s\) .) #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> #include<set> #define ll long long #define rg register using namespace std; inline int read(){ rg int x=0,o=1;char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar(); if(ch=='-')o=-1,ch=getchar(); while

Numpy中矩阵和数组的区别

懵懂的女人 提交于 2019-12-01 17:02:20
矩阵(Matrix)和数组(Array)的区别主要有以下两点: 矩阵只能为2维的,而数组可以是任意维度的。 矩阵和数组在数学运算上会有不同的结构。 代码展示 1.矩阵的创建 采用mat函数创建矩阵 class numpy.mat(data, dtype=None) (注释:Unlike matrix, asmatrix does not make a copy if the input is already a matrix or an ndarray. Equivalent to matrix(data, copy=False).这句话的含义也就是说,当传入的参数为一个矩阵或者ndarray的数组时候,返回值是和传入参数相同的引用,也就是当传入参数发生改变时候,返回值也会相应的改变。相当于numpy.matrix(data, copy=False)) import numpy as np e = np.array([[1, 2], [3, 4]]) # 传入的参数为ndarray时 # e= np.matrix([[1, 2], [3, 4]]) # 传入的参数为矩阵时 print(e) print('e的类型:', type(e)) print('---'*5) e1 = np.mat(e) print(e1) print('e1的类型:', type(e1)) print('