矩阵乘法

机器学习 矩阵的基本运算

自作多情 提交于 2020-02-13 03:54:39
矩阵的基本概念 假设 a i j ∈ R , 其中 i = 1 , 2 , . . . , m ; j = 1 , 2 , . . . , n . 我们定义如下的行列式: A = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ a 11 a 21 ⋮ a m 1 a 12 a 22 ⋮ a m 2 ⋯ ⋯ ⋯ a 1 n a 2 n ⋮ a m n ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ 是一个维数为 m × n 的实数矩阵。有时候我们会用如下的表达式来表示一个矩阵: A = [ a i j ] , i = 1 , 2 , . . . , m ; j = 1 , 2 , . . . , n 这表示一个 m 行 n 列的矩阵,下标的第一个数 i 表示行,第二个数 j 表示列。 列向量定义: 一个向量可以看成是只有一列的矩阵,所以,这里讨论的所有向量都默认为列向量。 符号定义: 矩阵用大写的粗体字母表示,比如矩阵 A , B , X , 而向量用小写的粗体字母表示,比如向量 a , b , x . 矩阵的转置: 矩阵 A 的转置为 A T . 矩阵的逆: 如果一个矩阵 A 存在逆矩阵,则该逆矩阵表示为 A − 1 . 矩阵的 determinant: 如果一个矩阵 A 是一个方阵,则它的determinant表示为 | A | 单位矩阵 表示为 I , 零矩阵 或 空矩阵 表示为 0 。 矩阵的迹: 如果一个矩阵是 n ×

矩阵特征值

試著忘記壹切 提交于 2020-02-13 02:19:32
参考:https://www.zhihu.com/question/21874816 如何理解矩阵特征值? 想要理解特征值,首先要理解矩阵相似。什么是矩阵相似呢?从定义角度就是:存在可逆矩阵P满足B= 则我们说A和B是相似的。让我们来回顾一下之前得出的重要结论:对于同一个线性空间,可以用两组不同的基 和基 来描述,他们之间的过渡关系是这样的: ,而对应坐标之间的过渡关系是这样的: 。其中P是可逆矩阵,可逆的意义是我们能变换过去也要能变换回来,这一点很重要。 我们知道,对于一个线性变换,只要你选定一组基,那么就可以用一个矩阵T1来描述这个线性变换。换一组基,就得到另一个不同的矩阵T2(之所以会不同,是因为选定了不同的基,也就是选定了不同的坐标系)。所有这些矩阵都是这同一个线性变换的描述,但又都不是线性变换本身。具体来说,有一个线性变换 ,我们选择基 来描述,对应矩阵是 ;同样的道理,我们选择基 来描述 ,,对应矩阵是 ;我们知道基 和基 是有联系的,那么他们之间的变换 和 有没有联系呢? 当然有, 和 就是相似的关系,具体的请看下图: <img src="https://pic1.zhimg.com/6cf43eca0f26cb1752f8fbf2633b699c_b.jpg" data-rawwidth="721" data-rawheight="449" class

R 基本函数总结

我只是一个虾纸丫 提交于 2020-02-11 09:49:05
基本 一、数据管理 vector:向量 numeric:数值型向量 logical:逻辑型向量 character;字符型向量 list:列表 data.frame:数据框 c:连接为向量或列表 length:求长度 subset:求子集 seq,from:to,sequence:等差序列 rep:重复 NA:缺失值 NULL:空对象 sort,order,unique,rev:排序 unlist:展平列表 attr,attributes:对象属性 mode,typeof:对象存储模式与类型 names:对象的名字属性 二、字符串处理 character:字符型向量 nchar:字符数 substr:取子串 format,formatC:把对象用格式转换为字符串 paste,strsplit:连接或拆分 charmatch,pmatch:字符串匹配 grep,sub,gsub:模式匹配与替换   三、复数 complex,Re,Im,Mod,Arg,Conj:复数函数   四、因子 factor:因子 codes:因子的编码 levels:因子的各水平的名字 nlevels:因子的水平个数 cut:把数值型对象分区间转换为因子 table:交叉频数表 split:按因子分组 aggregate:计算各数据子集的概括统计量 tapply:对“不规则”数组应用函数 数学 一、计算 +,

R语言:常用函数【转】

橙三吉。 提交于 2020-02-11 09:48:40
数据结构 一、数据管理 vector:向量 numeric:数值型向量 logical:逻辑型向量 character;字符型向量 list:列表 data.frame:数据框 c:连接为向量或列表 length:求长度 subset:求子集 seq,from:to,sequence:等差序列 rep:重复 NA:缺失值 NULL:空对象 sort,order,unique,rev:排序 unlist:展平列表 attr,attributes:对象属性 mode,typeof:对象存储模式与类型 names:对象的名字属性 二、字符串处理 character:字符型向量 nchar:字符数 substr:取子串 format,format C:把对象用格式转换为字符串 paste,strsplit:连接或拆分 charmatch,pmatch:字符串匹配 grep,sub,gsub:模式匹配与替换 三、复数 complex,Re,Im,Mod,Arg,Conj:复数函数 四、因子 factor:因子 codes:因子的编码 levels:因子的各水平的名字 nlevels:因子的水平个数 cut:把数值型对象分区间转换为因子 table:交叉频数表 split:按因子分组 aggregate:计算各数据子集的概括统计量 tapply:对“不规则”数组应用函数 数学相关计算 一、计算

R语言常用函数

元气小坏坏 提交于 2020-02-11 09:42:11
数据结构 一、数据管理 vector:向量 numeric:数值型向量 logical:逻辑型向量 character;字符型向量 list:列表 data.frame:数据框 c:连接为向量或列表 length:求长度 subset:求子集 seq,from:to,sequence:等差序列 rep:重复 NA:缺失值 NULL:空对象 sort,order,unique,rev:排序 unlist:展平列表 attr,attributes:对象属性 mode,typeof:对象存储模式与类型 names:对象的名字属性 二、字符串处理 character:字符型向量 nchar:字符数 substr:取子串 format,format C:把对象用格式转换为字符串 paste,strsplit:连接或拆分 charmatch,pmatch:字符串匹配 grep,sub,gsub:模式匹配与替换 三、复数 complex,Re,Im,Mod,Arg,Conj:复数函数 四、因子 factor:因子 codes:因子的编码 levels:因子的各水平的名字 nlevels:因子的水平个数 cut:把数值型对象分区间转换为因子 table:交叉频数表 split:按因子分组 aggregate:计算各数据子集的概括统计量 tapply:对“不规则”数组应用函数 数学相关计算 一、计算

R语言矩阵matrix函数

依然范特西╮ 提交于 2020-02-11 09:39:09
矩阵是元素布置成二维矩形布局的R对象。 它们包含相同原子类型的元素。尽管我们可以创建只包含字符或只逻辑值的矩阵,但是它们没有多大用处。我们使用的是在数学计算中含有数字元素矩阵。 使用 matrix()函数创建一个矩阵。 语法 R语言中创建矩阵的基本语法是: matrix(data, nrow, ncol, byrow, dimnames) 以下是所使用的参数的说明: data - 是这成为矩阵的数据元素输入向量。 nrow - 是要创建的行数。 ncol - 要被创建的列的数目。 byrow - 是一个合乎逻辑。如果为True,那么输入向量元素在安排的行。 dimname - 是分配给行和列名称。 示例 创建矩阵取向量的数量作为输入 # Elements are arranged sequentially by row. M <- matrix(c(3:14), nrow=4, byrow=TRUE) print(M) # Elements are arranged sequentially by column. N <- matrix(c(3:14), nrow=4, byrow=FALSE) print(N) # Define the column and row names. rownames = c("row1", "row2", "row3", "row4")

数论初步

泪湿孤枕 提交于 2020-02-09 12:39:08
PS:以下部分定理没有证明,如果有读者想要了解定理的具体证明,请自行百度,本文限于篇幅 (只是因为笔者自己不会) ,对部分定理的证明不作讨论。 本文讲啥 本文主要讲的是ACM中的数论基础内容 (以后可能会再写一篇ACM的数论进阶内容) ,侧重应用,证明都是瞎证的,严谨的证明请观众姥爷自行百度 线性筛筛素数 埃氏筛 埃氏筛用每个素数来筛掉它的倍数,剩下的就是素数,时间复杂度是 \(O(nloglogn)\) 为啥能正确地筛? 每一个合数,都可以被质因数分解,且根据 唯一分解定理 ,这个分解是唯一的,所以只要拿每个素数把它的倍数都筛掉,就能所有合数筛掉 板子 bool check[maxn]; std::vector<ll> prime; for (ll i = 2; i <= n; ++i) if (!check[i]) { prime.push_back(i); for (ll j = i * i; j <= n; j += i) check[j] = 1; } 为啥 \(j\) 从 \(i^2\) 开始? 上面的板子中第二层循环就是用素数筛掉它的倍数的过程, \(j\) 从 \(2i\) 开始循环,那为什么板子里是从 \(i^2\) 开始呢?实际上,这是一个小小的优化,因为在用素数 \(i\) 来筛它的倍数时,区间 \([2, i-1]\) 中的所有素数已经将它的倍数都筛过了

[HNOI2001] 矩阵乘积

ε祈祈猫儿з 提交于 2020-02-08 10:29:31
一道上古时代的题 这道题看上去很简单,一个矩阵乘法的板子题 但是 数据范围 N ≤ 6000 N\leq6000 N ≤ 6 0 0 0 ,那么时间复杂度 O ( N 3 ) O(N^3) O ( N 3 ) ,空间复杂度 O ( N 2 ) O(N^2) O ( N 2 ) 都炸了,所以我们要进一步考虑 我们发现 他只询问一个位置的数 所以 我们就可以只存答案那一行,而且,答案只和那一行(或者那一列有关) 切了!said gjm(sto gjm) 别急,这道题读入还极其的恶心,他是一个一个点给出的,考验编程技巧的时刻到了 我们可以 for ( ; ; ) { fgets ( input , 10000 , stdin ) ; if ( ! isdigit ( input [ 0 ] ) ) break ; sscanf ( input , "%d%d%d" , & u , & v , & val ) ; if ( u == x ) Am [ v ] = val ; } for ( ; ; ) { fgets ( input , 10000 , stdin ) ; if ( ! isdigit ( input [ 0 ] ) ) break ; sscanf ( input , "%d%d%d" , & u , & v , & val ) ; Bm [ v ] + = Am [ u

基础训练—矩阵乘法C语言 & C++ & JAVA(给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如:A = 1 2 3 4 A的2次幂  7 10  15 22 输入格式   第一)

吃可爱长大的小学妹 提交于 2020-02-08 09:12:19
问题描述 矩阵乘法 给定一个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 直接代码呈上:C语言 //注释里面有解释 # include <stdio.h> # include <string.h> # define N 100 int A [ N ] [ N ] , t [ N ] [ N ] , r [ N ] [ N ] ; int main ( ) { int n , m , i , j , k ; scanf ( "%d%d" , & n , & m ) ; //输入矩阵的阶数和幂次数 for ( i = 0 ; i < n ; i ++ ) for ( j = 0 ; j < n ; j ++ ) scanf ( "%d" , & A [ i ] [ j ] ) ; //输入矩阵 for ( i = 0 ; i < n ; i ++ ) r [ i

矩阵快速幂

穿精又带淫゛_ 提交于 2020-02-07 18:20:10
在一些递推n很大的时候,很可能会超时,这样矩阵快速幂就派上用场了. 下面看一个非常经典的例题,斐波那契数列 已知f[1]=1,f[2]=1;F[n]=f[n-1]+f[n-2],给定n,求f[n]; 一看到这到题很多人就会说这不是到入门题吗?;直接上代码 #include<cstdio> #include<cstdlib> #include<iostream> using namespace std; int main() { long long n,a,b; scanf("%lld",&n); a=1,b=1; for(int i=3; i<=n; i++) b=a+b,a=b-a; printf("%lld",b); return 0; } 但是这样很明显是初学者的想的.如果n大一点你呢?这样子这个算法就有点显得太垃圾了.所以我们应该另一种更优的算法.那么这个算法是什么呢?这就要用的了矩阵快速幂了.那么什么是矩阵快速幂呢?在介绍快速幂之前,有几个前置技能 学过oi 会打程序 快速幂 矩阵乘法 前面两个默认你已经掌握了,如果没有,请按Alt + F4 即可; 首先讲一讲快速幂: 什么是快速幂呢?快速幂顾名思义就是快速求幂.其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高. 如果不想学可以用朴素算法,但是超时就不管了 快速幂算法的详解: 传送门