矩阵乘法

卷积的实现原理

筅森魡賤 提交于 2020-03-09 13:48:02
卷积的实现原理 特征图作为矩阵乘法的右元 特征图作为矩阵乘法的左元 总结   我前面的一篇文章中, 卷积操作的计算量 分析中,引用了矩阵相乘来概括卷积的计算量,这样做确实是有道理的,因为在 卷积的实现中的确是通过矩阵相乘来加速卷积的计算。 但是我在那篇文章只是简单的通过矩阵相乘来简单的分析了一下维度信息,事实上,各种框架的实现也并不一定符合我的分析,但是殊途同归。   本文将为大家耐心整理了一下具体的实现( 吐槽一下干这件事确实花了我相当多的功夫,因为网上写的东西太乱了,很多人都搞错了框架和实现的对应。再或者是自己的分析和配图不符,或者是自己实现后一运行,单通道对了,多通道就错了 。)   首先也是从最容易错的地方,通道这个概念说起,大体目前的框架实现卷积的时候,特征图格式分为两种,一种是 N ∗ C ∗ H ∗ W N*C*H*W N ∗ C ∗ H ∗ W ,即N表示batchsize中特征图的数量,C表示通道数,H,W表示每个特征图的长宽。一种是 N ∗ H ∗ W ∗ C N*H*W*C N ∗ H ∗ W ∗ C ,与第一种的区别在于通道的位置不一样。首先通道的位置决定了一个通道是否连续的问题,连续的利于访问局部性,可以提高速度。另一个差异决定了决定了矩阵乘法的结果形状转化有区别。   另外一处区别就在于,那就是矩阵乘法操作的特征图作为左元和右元的区别。这句话怎么理解

Apache Spark源码走读之14 -- Graphx实现剖析

风流意气都作罢 提交于 2020-03-07 12:04:03
欢迎转载,转载请注明出处,徽沪一郎。 概要 图的并行化处理一直是一个非常热门的话题,这里头的重点有两个,一是如何将图的算法并行化,二是找到一个合适的并行化处理框架。Spark作为一个非常优秀的并行处理框架,将一些并行化的算法移到其上面就成了一个很自然的事情。 Graphx是一些图的常用算法在Spark上的并行化实现,同时提供了丰富的API接口。本文就Graphx的代码架构及pagerank在graphx中的具体实现做一个初步的学习。 Google为什么赢得了搜索引擎大战 当Google还在起步的时候,在搜索引擎领域,Yahoo正如日中天,红的发紫。显然,在Google面前的是一堵让人几乎没有任何希望的墙。 但世事难料,现在“外事问谷歌”成了不争的事实,Yahoo应也陪客了。 这种转换到底是如何形成的了,有一个因素是这样的,那就是Google发明了显著提高搜索准确率的PageRank算法。如果说PageRank算法的提出让谷歌牢牢站稳了搜索引擎大战的脚跟,这是毫不夸张的。 搜索引擎有几个要考虑的关键因素(个人观点而已)。 要想吸引用户,就必须要有出色的搜索准确率 有了用户,才能做广告投放,提高广告投放的针对性就可以盈利 上述两个方面都有非常优秀的算法。 废话少述,回到正题。PageRank算法是图论的一个具体应用,ok, 转到图论。 图论简介 图的组成

Eigen矩阵基本运算

血红的双手。 提交于 2020-03-07 07:06:00
1 矩阵基本运算简介 Eigen重载了+,-,*运算符。同时提供了一些方法如dot(),cross()等。对于矩阵类的运算符重载只支持线性运算,比如matrix1*matrix2是矩阵相乘,当然必须要满足矩阵乘法规则。对于向量和标量的加法(vector+scalar)这里并不支持,关于非线性运算这里暂不介绍。 2 加减运算 矩阵加减运算中必须要保证左右矩阵的行列对应相等。此外更重要的一点是,矩阵的类型也必须一致,这里的矩阵运算 并不支持隐式的类型转换 。矩阵运算中重载的运算符有: 二元运算符+:a+b 二元运算符-:a-b 一元运算符-:-a 复合运算符+=:a+=b 复合运算符-=:a-=b 下面是使用示例: #include <iostream> #include "Eigen\Dense" using namespace Eigen; int main() { Matrix2d a; a<<1,2, 3,4; MatrixXd b(2,2); b<<2,3, 1,4; std::cout<<"a+b=\n"<<a+b<<std::endl; std::cout<<"a-b=\n"<<a-b<<std::endl; std::cout<<"Doing a+=b;"<<std::endl; a+=b; std::cout<<"Now a=\n"<<a<<std::endl;

【dp】矩阵乘法/数乘

元气小坏坏 提交于 2020-03-06 18:34:53
最大K乘积问题 « 问题描述 设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。 例如十进制整数 1234 划分为 3 段可有如下情形: 1 × 2 × 34 = 68 1 × 23 × 4 = 92 12 × 3 × 4 = 144 « 编程任务 对于给定的I 和k,编程计算I 的最大k 乘积。 « 数据输入 输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10) « 结果输出ss 计算出的最大k乘积。 输入文件示例 输出文件示例 input.txt output.txt 3 2 312 62 « 实现提示 参考矩阵连乘问题。 #include <iostream> #include <cstdio> #include <cmath> using namespace std; /* void copyMatrixchain(){ int i,r,j,k; memset(m,0,sizeof(m)); memset(s,0,sizeof(s)); for(r=2;r<=n;r++) //跨度从2-n { for(i=1;i<=n-r+1;i++) //遍历 { j=i+r-1; m[i][j]=m[i+1

矩阵快速幂

有些话、适合烂在心里 提交于 2020-03-06 03:32:27
矩阵是种神奇的东西,无奈我这种数学渣对于他的理解只能是表面。 快速幂应该都很熟悉,实际上把快速幂里面的乘法换成矩阵乘法就可以变为矩阵快速幂 上份模板: 1 typedef vector<int>vec; 2 typedef vector<vec>mat; 3 typedef long long ll; 4 mat mul(mat &A,mat &B){ 5 mat C (A.size(),vec(B[0].size())); 6 for(int i=0;i<A.size();++i){ 7 for(int k=0;k<B.size();++k){ 8 for(int j=0;j<B[0].size();++j){ 9 C[i][j]=(C[i][j]+(A[i][k]*B[k][j])%mod)%mod; 10 } 11 } 12 } 13 return C; 14 } 15 mat pow(mat A,ll n){ 16 mat B (A.size(),vec(A.size())); 17 for(int i=0;i<A.size();++i)B[i][i]=1; 18 while(n>0){ 19 if(n&1)B = mul(B,A); 20 A = mul(A,A); 21 n>>=1; 22 } 23 return B; 24 } View Code

2 线性代数基础

感情迁移 提交于 2020-03-05 15:56:11
转自: https://blog.csdn.net/longxinchen_ml/article/details/51629328 1 基本概念和符号 线性代数可以对一组线性方程进行简洁地表示和运算。例如,对于这个方程组: 这里有两个方程和两个变量,如果你学过高中代数的话,你肯定知道,可以为x1 和x2找到一组唯一的解 (除非方程可以进一步简化,例如,如果第二个方程只是第一个方程的倍数形式。但是显然上面的例子不可简化,是有唯一解的)。在矩阵表达中,我们可以简洁的写作: 其中: 很快我们将会看到,咱们把方程表示成这种形式,在分析线性方程方面有很多优势(包括明显地节省空间)。 1.1 基本符号 以下是我们要使用符号: 符号 A ∈ R m×n 表示一个m行n列的矩阵,并且矩阵A中的所有元素都是实数。 符号x ∈ R n 表示一个含有n个元素的向量。通常,我们把n维向量看成是一个n行1列矩阵,即列向量。如果我们想表示一个行向量(1行 n 列矩阵),我们通常写作 x T ( x T 表示x的转置,后面会解释它的定义)。 一个向量x的第 i 个元素表示为x i : 我们用 a ij (或 A ij , A i , j ,等) 表示第 i 行第 j 列的元素: 我们用 a j 或 A : , j 表示A矩阵的第 j 列元素: 我们用 a T i 或 A i , : 表示矩阵的第i行元素:

[SDOI2009]HH去散步(dp,矩阵乘法)

安稳与你 提交于 2020-03-05 08:24:47
[SDOI2009]HH去散步(luogu) Solution 考虑dp,设计状态 f[i][j] 为当前从起点走了 i 步,到达 j 点 但要避免走上一条走过的路,所以还要记录上一条走过的路是哪一条 可以将 f[i][j] 改为表示当前从起点走了 i 步,在编号为 j 的有向路的终点 转移为f[i][j]=$\Sigma$ f[i-1][k] (编号为 k 的有向路的终点是 j 的起点,且不是 j 的反边) 发现 t 过大,不过对于一个 j ,能转移到它的 k 是固定的 于是可以矩阵乘法 Code #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int N=51,M=121,P=45989; int head[N],nxt[M],ver[M],tot; int n,m,t,a,b,u,v,ans[M][M],pre[M][M],now[M][M]; void mul1() { memset(now,0,sizeof(now)); for(int i=1;i<=tot;i++) for(int j=1;j<=tot;j++) for(int k=1;k<=tot;k++) now[i][j]+=ans[i][k]*pre[k][j]%P,now[i][j]%=P;

线性代数知识点总结

我只是一个虾纸丫 提交于 2020-03-04 23:26:12
直观理解线性代数的本质 如何理解矩阵特征值以及特征向量? 一篇很好的文章 A x = λ x Ax = \lambda x A x = λ x 可以把A看成是一个线性变换,那么这个定义可以看成对于向量x而言,在A的作用下保持方向不变(可能反向),进行大小为 λ \lambda λ 的缩放。 特征向量所在的直线包含了所有特征向量. 矩阵乘以特征向量可以看成是矩阵在每个特征向量方向上的投影。通过求特征值和特征向量把矩阵数据投影在一个正交的空间,而且在各个方向的投影大小就是特征值。 最大特征值并不是说数据在所有方向的投影的最大值,而仅限于正交空间的某一方向。最大特征值的特征向量所对应的方向就是速度最大的方向。 其实是一种数据的处理方法,可以简化数据。 特征值特征向量的重要例子 :数据挖掘中PCA(主成分分析)用于数据降维 详情点击 什么是相似矩阵?有什么用? ![{%asset_img 2.png%}](https://img-blog.csdnimg.cn/202003041016572.png) 线性变换 例如: y ⃗ = A x ⃗ \vec{y} = A\vec{x} y ​ = A x (类似于一次函数 y = x) 线性变换通过指定基下的矩阵A来表示 同一个线性变换,不同基下的矩阵称为相似矩阵.(任意向量在不同的基中有不同的表示)

动态规划-矩阵连乘

匆匆过客 提交于 2020-03-03 22:09:06
给定n个矩阵{A 1 ,A 2 ,…,A n },其中A i 与A i+1 是可乘的,i=1,2,…,n-1。考察这n个矩阵的连乘积A 1 A 2 …A n 。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,则可以依此次序反复调用2个矩阵相乘的标准算法(有改进的方法,这里不考虑)计算出矩阵连乘积。若A是一个p×q矩阵,B是一个q×r矩阵,则计算其乘积C=AB的标准算法中,需要进行pqr次数乘。 矩阵连乘积的计算次序不同,计算量也不同,举例如下: 先考察3个矩阵{A 1 ,A 2 ,A 3 }连乘,设这三个矩阵的维数分别为10×100,100×5,5×50。若按((A 1 A 2 )A 3 )方式需要的数乘次数为10×100×5+10×5×50=7500,若按(A 1 (A 2 A 3 ))方式需要的数乘次数为100×5×50+10×100×50=75000。 下面使用动态规划法找出矩阵连乘积的最优计算次序。 I: 设矩阵连乘积A i A i+1 …A j 简记为A[i:j],设最优计算次序在A k 和A k+1 之间断开,则加括号方式为:((A i A i+1 …A k )(A k+1 …A j ))。则依照这个次序,先计算A[i:k]和A[K+1:j]然后再将计算结果相乘,计算量是:A

矩阵连乘问题

元气小坏坏 提交于 2020-03-03 22:08:39
由于矩阵的乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这中计算次序 可以用加括号的方式来确定。例如,矩阵连乘积A1A2A3A4可以有5种不同的完全加括号方式: (A1(A2(A3A4))) (A1((A2A3)A4)) ((A1A2)(A3A4)) ((A1(A2A3))A4) (((A1A2)A3)A4) 矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p*q的矩阵, B是一个q*r的 矩阵,其乘机C=AB是一个p*r的矩阵,总共需要pqr次数乘。 为了说明在计算矩阵连乘积 时,加括号方式对整个计算量的影响,我们考察计算3个矩阵A1A2A3的连乘积的例子。 这3个矩阵的尺寸分别为10*100,100*5和5*50。 若以((A1A2)A3)这种方式计算, 3个矩阵的连乘积需要的数乘次数为7500。 若以(A1(A2A3))这种方式计算, 所需的数乘次数为75000。显然,在即算矩阵连乘积时,加括号方式对计算量有很大影响。 1.分析最优解的结构 设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解的结构特征。我们将矩 阵连乘积AiAi+1....Aj简记为A[ i : j ]。考察计算A[ 1: n]的最优计算次序。设这个计算 次序在矩阵Ak和Ak+1之间将矩阵链断开,1<=k<n,则其相应的完全加括号形式为((A1...Ak) (Ak+1..