矩阵乘法

矩阵快速幂模板+常用变式

╄→гoц情女王★ 提交于 2020-02-07 18:17:03
矩阵乘法(矩阵乘矩阵) 在向量乘向量的运算中,是将每个元素与它对应的元素相乘,求所有乘积之和 那么矩阵乘矩阵是不是就是两个同型矩阵的对应元素相乘呢? 图样图森破 两个矩阵相乘的前提是前一个矩阵的列数等于后一个矩阵的行数 举个栗子,AAA为n∗kn*kn∗k矩阵,BBB为k∗mk*mk∗m矩阵,CCC为m∗nm*nm∗n矩阵,那么AAA可以与BBB相乘,BBB可以与CCC相乘,CCC可以与AAA相乘,其他均不成立 我们知道了什么情况下两个矩阵可以相乘,那么他们怎么相乘呢?不讲每个对应位置相乘还能怎么乘呢? 设AAA为n∗kn*kn∗k矩阵,BBB为k∗mk*mk∗m矩阵,那么它们的乘积CCC则为一个n∗mn*mn∗m矩阵 Ci,j=∑r=1kAi,r∗Br,jC_{i,j}=\sum_{r=1}^kA_{i,r}*B_{r,j}Ci,j​=∑r=1k​Ai,r​∗Br,j​ 是不是不太好理解,没关系看看图就知道了 在矩阵乘法中满足以下运算律: (AB)C=a(BC)(AB)C=a(BC)(AB)C=a(BC) (A+B)C=AC+BC(A+B)C=AC+BC(A+B)C=AC+BC C(A+B)=CA+CBC(A+B)=CA+CBC(A+B)=CA+CB 了解了这么多,我们开始看题,矩阵快速幂,由于矩阵乘法满足结合律,所以我们只需要把它按照一般的快速幂打,再重载一下运算符就可以了

矩阵快速幂

会有一股神秘感。 提交于 2020-02-07 18:13:49
这周学习了矩阵快速幂,就在这里记录下我的一下理解吧。 要学习矩阵快速幂,首先得先知道“矩阵”和“快速幂”的写法。 先说快速幂 顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为O(log₂N),与朴素的O(N)相比效率有了极大的提高。 ——百度百科 以NOIP2013的麦森数为例题,讲一下快速幂 从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示) 本题显然要使用高精度运算。对2^P-1位数可以用公式log10(2^P-1)+1来求。因为2^P最后一位不可能为0,所以原式可化简为log10(2^P)+1=P*log10(2)+1。于是就能快速得到麦森数的位数了。 我们主要看求最后500位的运算。这显然要用到高精度。但是使用普通的高精度运算,时间复杂度就为P*500^2=2500P。对于最大的P=3100000,显然超时。那有没有更快的算法呢? 这就要牵扯到二进制了,二进制一直是很神奇的一个东西。 以十进制数5举例子,5的二进制为101,这可以通过取模然后反过来得到。看一下101是怎样表示5的。 二进制逢二进一。所以十位上的数就表示这个数有几个2,这就像十进制的十位表示这个数有几个10一样。所以像十进制一样往上推,百位上的数就表示这个数有几个2^2,千位上的数就表示这个数有几个2^3……那么根据这样,就可以看出,101=1

矩阵快速幂小结

旧街凉风 提交于 2020-02-07 18:07:34
update in 9.17 矩阵 并不想扯什么高端线代的内容 因为我也不会 定义 由$n \times m$个数$a_{ij}$排成的$n$行$m$列的数表称为$n$行$m$列的矩阵,简称$n \times m$矩阵。 $$ A = \begin{bmatrix} a_{11} & a_{12} & \dots a_{1m} \\ a_{21}, & \dots & \dots \\ a_{31}, & \dots & \dots \\ a_{41} & \dots & a_{nm} \end{bmatrix} $$ 运算 这里只讲加法减法和乘法,其他的例如矩阵求逆等与本文内容出入较大,有兴趣的可以自己学习 加法 注意,只有行列均相同的矩阵才有加法! 运算也比较简单,把对应位置的数相加得到一个新的矩阵,即为答案 例如 $$ \begin{bmatrix} 1 & 1 & 2 \\ 1 & 0 & 1 \end{bmatrix} + \begin{bmatrix} 2 & 3 & 3 \\ 3 & 3 & 2 \end{bmatrix} = \begin{bmatrix} 3 & 4 & 5 \\ 4 & 3 & 3 \end{bmatrix} $$ 加法满足以下运算律 $A + B = B + A$ $(A + B) + C = A + (B + C)$ 减法 与加法同理。 乘法

第二讲 cs224n系列之word2vec & 词向量

*爱你&永不变心* 提交于 2020-02-07 09:48:47
本系列是一个基于深度学习的NLP教程,2016年之前叫做CS224d: Deep Learning for Natural Language Processing,之后改名为CS224n: Natural Language Processing with Deep Learning。新版主讲人是泰斗Chris Manning和Richard Socher(这是旧版的讲师),两人分别负责不同的章节。博主在学习的同时,对重点内容做成系列教程,与大家分享! 系列目录(系列更新中) 第二讲 cs224n系列之word2vec & 词向量 1.语言模型 神经概率语言模型(Neural Probabilistic Language Model)中词的表示是向量形式、面向语义的。两个语义相似的词对应的向量也是相似的,具体反映在夹角或距离上。甚至一些语义相似的二元词组中的词语对应的向量做线性减法之后得到的向量依然是相似的。词的向量表示可以显著提高传统NLP任务的性能,例如《基于神经网络的高性能依存句法分析器》中介绍的词、词性、依存关系的向量化对正确率的提升等。 2.word2vec word2vec是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型

matlab考试重点详解

谁说我不能喝 提交于 2020-02-06 09:56:22
  此帖是根据期末考试复习重点补充完成, 由于使用word编辑引用图片和链接略有不便, 所以开此贴供复习及学习使用。侵删 复习要点 第一章 Matlab的基本概念,名称的来源,基本功能,帮助的使用方法 1.基本概念和名称来源: MATLAB [1] 是美国 MathWorks 公司出品的商业 数学软件 , 用于算法开发、数据可视化、数据分析以及 数值计算 的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。 MATLAB是matrix&laboratory两个词的 组合 ,意为矩阵工厂(矩阵实验室) 2.基本功能:   2.1数值计算和符号计算功能   MATLAB以矩阵作为数据操作的基本单位,还提供了十分丰富的数值计算函数。   2.2绘图功能,matlab提供了两个层次的绘图操作。一种是对图形句柄,进行底层绘图操作。另一种是建立在低层绘图操作之上的高层绘图操作。   2.3编程语言   MATLAB具有程序结构控制、函数调用、数据结构、输入输出、面向对象等程序语言特征,而且简单易学、编程效率高   2.4MATLAB工具箱   MATLAB包含两部分内容:基本部分和各种可选的工具箱。   MATLAB工具箱分为两大类:功能性工具箱和学科性工具箱。 3.帮助的使用方法   3.1 帮助命令   MATLAB帮助命令包括help命令和lookfor命令。

(6.3)动态规划之动态规划例子-矩阵相乘

拥有回忆 提交于 2020-02-05 23:16:45
文章目录 1.问题提出 2.关键计算问题 3.完全加括号的矩阵连乘积 4.矩阵连乘问题 1.问题提出 软件行业中客户总是在变更需求 银行对我们公司开发的乘法模块还不满意。他们的真实想法并不是实现两个矩阵的乘法,而是是能一次够实现多个矩阵按照算法运算法则的乘法,因此要求我们进一步改进我们的系统,实现多个矩阵的连乘功能,并且需要看到我们设计的程序能够满足他们的运行效率要求时才付二期款。 2.关键计算问题 给定n个矩阵{ A 1 A_1 A 1 ​ , A 2 A_2 A 2 ​ ,。。。 A n A_n A n ​ }, 其中 A i A_i A i ​ 与 A i + 1 Ai+1 A i + 1 是可乘的,i=1,2,…n-1。 考察这n个矩阵的连乘积 A 1 A_1 A 1 ​ A 2 A_2 A 2 ​ … A n A_n A n ​ 由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积 3.完全加括号的矩阵连乘积 设有四个矩阵 A,B,C,D, 它们的维数分别是: A=50 10 ,B =10 40 ,C = 40 30 D = 30 5 总共有五中完全加括号的方式,及相应的乘法次数如下 (A(

矩阵快速幂---斐波那契数列

家住魔仙堡 提交于 2020-02-05 22:21:53
矩阵快速幂就是将快速幂和矩阵乘法结合起来,快速幂我之前的博客里,矩阵乘法就是将矩阵快速幂和快速幂结合, 代码 # include <bits/stdc++.h> using namespace std ; struct node { int mat [ 15 ] [ 15 ] ; //定义矩阵 } x , y ; node mul ( node x , node y ) { //矩阵乘法 node tmp ; for ( int i = 0 ; i < 10 ; i ++ ) { for ( int j = 0 ; j < 10 ; j ++ ) { tmp . mat [ i ] [ j ] = 0 ; for ( int k = 0 ; k < 10 ; k ++ ) { tmp . mat [ i ] [ j ] + = ( x . mat [ i ] [ k ] * y . mat [ k ] [ j ] ) % 10000007 ; } tmp . mat [ i ] [ j ] = tmp . mat [ i ] [ j ] % 10000007 ; } } return tmp ; } node matpow ( node x , node y , int num ) { //矩阵快速幂 while ( num ) { if ( num & 1 ) { y = mul

【蓝桥】基础练习 矩阵乘法

核能气质少年 提交于 2020-02-02 20:36:37
原文地址 问题描述   给定一个N阶矩阵A,输出A的M次幂(M是非负整数)   例如:   A =   1 2   3 4   A的2次幂   7 10   15 22    输入格式   第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数   接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式   输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开    样例输入 2 2 1 2 3 4 样例输出 7 10 15 22 # include <iostream> using namespace std ; int main ( ) { int N , M , a [ 30 ] [ 30 ] , b [ 30 ] [ 30 ] , c [ 30 ] [ 30 ] ; // 输入a: c=0 c=b*a b=c c=0 b为最终结果 cin >> N >> M ; for ( int i = 0 ; i < N ; i ++ ) { // 输入a矩阵元素 for ( int j = 0 ; j < N ; j ++ ) { cin >> a [ i ] [ j ] ; b [ i ] [ j ] = a [ i ] [ j ] ; c [ i ] [ j ] = 0 ; } } if ( M

Numpy学习笔记(三)

大兔子大兔子 提交于 2020-02-01 19:21:12
Numpy的基本操作 前面我们已经知道了新建Numpy数组和定义数组元素的方法。现在来学习数组的各种运算方法 算术运算符 数组的第一类运算是使用算术运算符进行的运算。最显而易见的是为数组加上或乘以一个标量 >> > a = np . arange ( 4 ) >> > a array ( [ 0 , 1 , 2 , 3 ] ) >> > a + 4 array ( [ 4 , 5 , 6 , 7 ] ) >> > a * 2 array ( [ 0 , 2 , 4 , 6 ] ) >> > 这些运算符还可以用于两个数组的运算,在numpy中,这些运算符为 元素级 ,也就是说,它们只用于位置相同的元素之间,所得到的运算结果组成一个新的数组,运算结果在新数组中的位置跟操作数位置相同 >> > a array ( [ 0 , 1 , 2 , 3 ] ) >> > b = np . arange ( 4 , 8 ) >> > b array ( [ 4 , 5 , 6 , 7 ] ) >> > a + b array ( [ 4 , 6 , 8 , 10 ] ) >> > a - b array ( [ - 4 , - 4 , - 4 , - 4 ] ) >> > a * b array ( [ 0 , 5 , 12 , 21 ] ) >> > 此外

发霉日记 Day1

倾然丶 夕夏残阳落幕 提交于 2020-01-31 00:32:21
今日目标 矩阵快速幂 完成矩阵快速幂模板 矩阵快速幂的相关运用 刷题 矩阵快速幂 矩阵快速幂是将矩阵乘法和快速幂进行结合,对递推式进行快速运算的一种方法。 矩阵乘法 假如矩阵a有m列s行,矩阵b有s列n行,那么他们的乘积是一个m行n列的矩阵。 如图所示,矩阵a有2行3列,矩阵b有3行2列,那么矩阵c就是一个2*2的矩阵。 矩阵乘法的规则就是a矩阵的m行与b矩阵的n列分别相乘。 a矩阵的行必须b矩阵的列相等才能进行矩阵乘法 快速幂 int QuickPow(int x,int N) { int res = x;//底数 int ans = 1;//和 while(N) { if(N&1)//判断二进制数最后位是否为1 //如果为1 { ans = ans * res;//将和与当前底数相乘得到新的和 } res = res*res;//更新底数 N = N>>1;//将二进制数后移一位,相当于/2 } return ans; } 快速幂就是将幂拆解 对于2 18 ,根据18的二进制数1 0 0 1 0,我们可以将2 8 拆解为(2 16 )*(2 2 )=2 18 。 矩阵快速幂的实现 矩阵快速幂 = 对矩阵使用快速幂算法 具体实现原理为,矩阵取代快速幂算法中的底数,矩阵乘法取代快速幂中的算数乘法。 矩阵快速幂模板 struct matrix { int m [ maxx ] [