矩阵乘法

矩阵乘法题目汇总

烈酒焚心 提交于 2020-01-21 08:44:16
矩阵,学过线性代数的都知道,矩阵满足结合律,但不满足交换律 关于矩阵,有很多经典的应用,可以看下大牛的博客 http://www.matrix67.com/blog/archives/276 下面的题目中,最常见的一种应用就是利用矩阵求递推式,可以通过构造矩阵求幂 在这方面,最常见的就是在斐波那契数列方面,可以看下这个博客,超牛的 http://www.cnblogs.com/Knuth/archive/2009/09/04/1559951.html 很容易构造出关于斐波那契的矩阵,累乘求幂,就可以求出斐波那契的对应的项 直接开始题目吧 hdu1575 Tr A 题目,直接矩阵求幂,再求该矩阵的迹,注意,利用矩阵乘法满足结合律,我看可以利用二进制优化求幂次数。比如:A^7=A^4 * A^2 * A^1 具体的结合代码很容易理解的 View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int MOD = 9973;const int N = 11;int ret[N][N],init[N][N],temp[N][N];int n;void init_(){ for(int i=0;i<n;i++) for(int j=0;j<n;j++) ret[i][j]=

矩阵乘法

蹲街弑〆低调 提交于 2020-01-20 22:31:19
对于 矩阵乘法 , 本蒟蒻还是比较稀饭结构体版的,用起来极为方便 例题: 洛谷P3390【模板】矩阵快速幂 1 #include<iostream> 2 #include<cstdio> 3 4 #define LL long long 5 #define lowbit(X) X&(-X) 6 #define MOD (LL)(1e9+7)//错误点1 7 const int MAXn=1e2+1; 8 using namespace std; 9 10 inline int read() 11 { 12 int x=0,f=1; 13 char c=getchar(); 14 while(c<'0' || c>'9'){ 15 if(c=='-') f=-1; 16 c=getchar(); 17 } 18 while(c>='0' && c<='9'){ 19 x=x*10+c-'0'; 20 c=getchar(); 21 } 22 return x*f; 23 } 24 25 struct Node{ 26 LL Side,Fac; 27 LL Squ[MAXn][MAXn]; 28 29 inline void Clear_S(LL x) 30 { 31 for(int i=1;i<=Side;i++) 32 for(int j=1;j<=Side;j++) 33 Squ

Numpy学习50例

拥有回忆 提交于 2020-01-20 14:58:37
基础部分 1、导入numpy模块 import numpy as np 2、查看numpy版本信息 print(np.__version__) numpy的主要对象的多维数组Ndarray。Numpy中维度(dimensions)叫做轴(axis),轴的个数叫做秩。 3、通过列表创建一位数组 np.array([1, 2, 3]) 4、通过列表创建一个二维数组 np.array([(1, 2, 3),(4, 5, 6)]) 5、创建全为0的二维数组 np.zeros((3,3)) 6、创建全为1的三维数组 np.ones((2,3,4)) 7、创建一维等差数组 np.arange(5) 8、创建二维等差数组 np.arange(6).reshape(2,3) 9、创建二维单位矩阵 np.eye(3) 10、创建等间隔一维数组(1到10之间,共6个数,数字之间间隔相同) np.linspace(1, 10, num=6) 11、创建二维随机数组 np.random.rand(2,3) 下面说明一下random模块中的一些常用函数的用法 numpy.random.rand(d0, d1, ..., dn):生成一个[0,1)之间的随机浮点数或N维浮点数组。 numpy.random.randn(d0, d1, ..., dn):生成一个浮点数或N维浮点数组,取数范围

教你学Python32-预测数值型数据:数据回归

℡╲_俬逩灬. 提交于 2020-01-20 12:38:05
一、引言 前面的文章介绍了很多分类算法,分类的目标变量是标称型数据,而本节将会对连续型的数据做出预测。主要讲解简单的线性回归和局部加权线性回归。 二、什么是回归? 回归的目的是预测数值型的目标值。他和我们之前做的分类是不一样的。最直接的办法是依据输入写出一个目标值的计算公式。假如你想预测小姐姐男友法拉利汽车的功率,可能会这么计算: HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio 写成中文就是: 小姐姐男友法拉利汽车的功率 = 0.0015 * 小姐姐男友年薪 - 0.99 * 收听公共广播的时间 这就是所谓的回归方程(regression equation),其中的0.0015和-0.99称为回归系数(regression weights),求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了。具体的做法是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值。 说到回归,一般都是指线性回归(linear regression),所以本文里的回归和线性回归代表同一个意思。线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。需要说明的是,存在另一种成为非线性回归的回归模型,该模型不认同上面的做法,比如认为输出可能是输入的乘积。这样

线性代数学习笔记——矩阵

陌路散爱 提交于 2020-01-17 23:39:25
1.引出 在利用Gauss消元法求解线性方程组的过程中,参与运算的只是其中的系数和常数项,将这些系数和常数项写成"表格"的形式来表示求解的过程,于是引入矩阵的概念。 2.定义 矩阵及其初等行变换  ①矩阵 ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ ⋮ a s 1 a s 2 ⋯ a s n ) (1) \left( \begin{matrix} a11 &a12 &\cdots &a1n \\ a21 &a22 &\cdots &a2n \\ \vdots &\vdots &\vdots &\vdots \\ as1 &as2 &\cdots &asn \end{matrix} \right)\tag{1} ⎝ ⎜ ⎜ ⎜ ⎛ ​ a 1 1 a 2 1 ⋮ a s 1 ​ a 1 2 a 2 2 ⋮ a s 2 ​ ⋯ ⋯ ⋮ ⋯ ​ a 1 n a 2 n ⋮ a s n ​ ⎠ ⎟ ⎟ ⎟ ⎞ ​ ( 1 ) a ij 称为矩阵的 元素 。元素为实数的矩阵称为 实矩阵 ,元素为复数的矩阵称为 复矩阵 。如果s=n,则(1)式中的矩阵称为 n阶矩阵 或 n阶方阵 两个矩阵完全相同时(行数相同,列数相同,对应元素相同),称他们 相等 两个或两个以上矩阵,行数相同,列数相同,称它们为 同型矩阵  ②初等行变换

【总结】矩阵快速幂

蓝咒 提交于 2020-01-17 22:42:50
在学习矩阵快速幂之前,首先我们需要分别了解快速幂和矩阵乘法 快速幂 快速幂要求解的是这样一类问题: 给你A,B,C,求A的B次方模C的余数 A,C<=10^9,B<=10^18 如果我们线性去求,时间复杂度是O(n)的,但题目中给出的B是很大的数,这样显然会超时,我们可以用快速幂来加速这个过程。 我们可以想像一下小学的时候我们如何计算2^16 2^16=4^8=16^4=256^2=65536 那如何计算2^18呢? 2^18=4^9=4 4^8=4 16^4=4 256^2=4 65536=262144 快速幂同理也是如此 我们可以按照上面做法,利用分治的思想求去解 这样原本O(n)的时间复杂度便降到了O(log n ) long long ans=1,base=a; while(n>0){ if(n&1){ ans*=base; } base*=base; n=n/2; } 矩阵乘法 矩阵乘法可以先稍作了解,知道矩阵相乘的运算法则 • \(C[i][j]= A[i][k]B[k][j]\) 矩阵快速幂 矩阵快速幂的原理同快速幂一样,只是转换为了矩阵之间的乘法操作 所以单纯的重载一下运算符,将普通的乘法转换为矩阵乘法就好了。 嗯,看一下代码就应该很好理解了x #include<iostream> #include<cstdio> #include<cctype> #define

Android 变形矩阵——Matrix

荒凉一梦 提交于 2020-01-17 06:49:19
对于图像的色彩处理,Android系统提供了ColorMatrix颜色矩阵来帮助我们进行图像处理。而对于图像的图形变化,Android系统也是通过来进行处理的,每个像素点都表达了其坐标的X、Y信息。Android的图形变换矩阵是一个3x3的矩阵,如图(1)所示。 当使用变换矩阵去处理每一个像素点的时候,与颜色矩阵的矩阵乘法一样,计算公式如下所示。 X1 = a * X + b * Y + c Y1 = d * X + e * Y + f l = g * X + h * Y + i 通常情况下,会让g=h=0,i=1,这是使 l = g * x + h *y + i恒成立。因此,只需要关注上面几个参数就可以了。 与色彩变换矩阵的初始矩阵一样,图像变换矩阵也有一个初始矩阵。很明显,就是对直角元素a、e、i我1,其他元素我0的矩阵,如图(2)所示。 图像的变化处理通常包含以下四类基本变化 ● Translate——平移变换 ● Rotate——选择变换 ● Scale——缩放变换 ● Skew——错切变换 ▶ 平移变换 平移变换的坐标值变换过程如图(3)所示,即将每个像素点都进行平移变换。 当从p(X0,Y0)平移到p(X,Y),坐标值发送了如下所示的变换 X = X0 + △X Y = Y0 + △Y 如果写成矩阵形式就是如图(4)所示。 通过技计算可发现如下等式。 X = X0 +

【花书笔记】第2章 线性代数

久未见 提交于 2020-01-16 02:02:57
本系列博客作为记录花书的一些知识点,一些“显而易见”的,我就不多写了 2.1 标量、向量、矩阵和张量 标量:一个单独的数。 向量:一列数。 矩阵:一个二维数组。 张量:一个数组中的元素分布在若干维坐标的规则网络中,我们称之为张量。 转置:矩阵的转置是以对角线为轴的镜像。 2.2 矩阵和向量相乘 矩阵乘积: 元素对应乘积(Hadamard乘积):两个矩阵的标准乘积不是指两个矩阵中对应元素的乘积。不过,那样的矩阵操作确实是存在的,被称为元素对应乘积(element-wise product)或者Hadamard 乘积(Hadamard product),记为 A ⊙ B。 点积:两个相同维数的向量 x 和 y 的点积(dot product)可看作是矩阵乘积 x ⊤ y。 2.3 单位矩阵和逆矩阵 单位矩阵: 逆矩阵: 2.4 线性相关和生成子空间 线性相关: 线性无关:如果一组向量中的任意一个向量都不能表示成其他向量的线性组合,那么这组向量称为线性无关。 2.5 范数 1. 2.范数是满足下列性质的任意函数: 3.p=2时,L²范数是欧几里得范数,表示从原点出发到向量x确定的点的欧几里得距离。 4.平方L²范数也经常用来衡量向量的大小,可以简单的通过点积 计算。 5.平方L²范数在计算上比L²范数本身方便,但是它在原点附近增长得十分缓慢。在某些机器学习应用中

矩阵乘法(c++算法)

雨燕双飞 提交于 2020-01-15 04:04:57
求n阶矩阵的m次幂 # include <iostream> # include <stdio.h> using namespace std ; int n ; void mul ( int s [ 30 ] [ 30 ] , int s1 [ 30 ] [ 30 ] , int s2 [ 30 ] [ 30 ] , int n ) ; int main ( ) { int str [ 30 ] [ 30 ] ; int s1 [ 30 ] [ 30 ] ; int s2 [ 30 ] [ 30 ] ; int m ; cin >> n >> m ; for ( int i = 0 ; i < n ; i ++ ) for ( int j = 0 ; j < n ; j ++ ) cin >> str [ i ] [ j ] ; if ( m == 0 ) { for ( int i = 0 ; i < n ; i ++ ) for ( int j = 0 ; j < n ; j ++ ) { if ( i == j ) s2 [ i ] [ j ] = 1 ; else s2 [ i ] [ j ] = 0 ; } } if ( m == 1 ) { for ( int i = 0 ; i < n ; i ++ ) for ( int j = 0 ; j < n ; j ++ )

总结:numpy中三个乘法运算multiply,dot和* 的区别

人走茶凉 提交于 2020-01-14 23:57:23
引言: 本人在做机器学习的练习1的时候,时常抛出错误: Not aligned是什么意思呢? 意思是两个矩阵相乘无意义。 线性代数中mxn 和 nxp的矩阵才能相乘,其结果是mxp的矩阵。 出错源代码: def gradientDescent(X,y,theta,alpha,iteration): colunms = int(theta.ravel().shape[1]) thetai = np.matrix(np.zeros(theta.shape)) cost = np.zeros(iteration) for i in range(iteration): error = X*theta.T-y for j in range(colunms): a = np.sum(error*X[:,j])/len(X) ########## error! thetai[0,j] = thetai[0,j] - alpha*a theta = thetai cost[i] = computeCost(X, y, theta) return theta,cost 这里error是一个nx1的矩阵,theta.T也是一个nx1的矩阵。 而矩阵之间*运算符表示矩阵乘法。我们这里想实现矩阵的对应元素相乘,因此应该用np.multiply()实现。 总结: (读者可使用简单的举例自行验证) 1.*用法