20200510·Kony·Win10
矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。一般使用格式为
mymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns,
byrow=logical_value, dimnames=list(
char_vector_rownames, char_vector_colnames))
参数说明
vector包含了矩阵的元素;
nrow和ncol用以指定行和列的维数;
dimnames包含了可选的、以字符型向量表示的行名和列名。
选项 byrow 则表明矩阵应当按行填充( byrow=TRUE )还是按列填充( byrow=FALSE ),默认情况下按列填充
1. 创建矩阵
matrix()
a<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=T)
a
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
dim()
通过dim来创建,先生成向量x,接着给向量x适当的维数,此例子中给向量的维数为5行,3列:
x <- 1:15
x # 建立x
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
dim(x) #查看x的维度
## NULL
dim(x) <- c(5,3) # 将向量x转化为5行3列的矩阵
x
## [,1] [,2] [,3]
## [1,] 1 6 11
## [2,] 2 7 12
## [3,] 3 8 13
## [4,] 4 9 14
## [5,] 5 10 15
2. 矩阵命名
Dimnames(Row_name,Col_name),给定行和列的名称,如果不需要给行或者列命名,则以NULL代替。
a<-c(1,2,3,4,5,6);
a
## [1] 1 2 3 4 5 6
a<-matrix(a,nrow=2,byrow=T,dimnames=list(c('a','b'),c('A','B','C')));
a
## A B C
## a 1 2 3
## b 4 5 6
用rownames与colnames实现
b
## [1] 2 3 4 5 6 7
b<-matrix(b,nrow=2) # 将向量b转化为矩阵
b
## [,1] [,2] [,3]
## [1,] 2 4 6
## [2,] 3 5 7
rownames(b)<-c("row_1","row_2") # 将矩阵行命名
colnames(b)<-c("col_1","col_2","col_3") # 将矩阵的列命名
b
col_1 col_2 col_3
row_1 2 4 6
row_2 3 5 7
3. 参看矩阵
3.1 查看矩阵行/列相关信息
colnames(a) # 查看矩阵列名
## [1] "A" "B" "C"
rownames(a) # 查看矩阵行名
## [1] "a" "b"
3.2 查看矩阵的维度
dim(a) # 返回行与列数
## [1] 2 3
nrow(a) # 返回行数
## [1] 2
ncol(a) # 返回列数
## [1] 3
3.3 条件提取子集矩阵
a # 查看矩阵a
## A B C
## a 1 2 3
## b 4 5 6
a[2,3] #取矩阵a的第行,第3个元素
## [1] 6
a[,1] #取矩阵a的第1列
## a b
## 1 4
a[1,] # 取矩阵a的第1行
## A B C
## 1 2 3
x<-c(1,2,3,4,5,6,7,8,8)
x<-matrix(x,nrow=3)
x
## [,1] [,2] [,3]
## [1,]1 4 7
## [2,]2 5 8
## [3,]3 6 8
x[,3] # 选取矩阵的第3列
## [1] 7 8 8
x[3,] # 选取矩阵的第3行
## [1] 3 6 8
y<-x[,3,drop=FALSE] # 选取x矩阵的第3列,并返回一个矩阵给y
y
## [,1]
## [1,] 7
## [2,] 8
## [3,] 8
x[,-1] # 不显示矩阵的第1列
## [,1] [,2]
## [1,]4 7
## [2,]5 8
## [3,]6 8
x[-1,] # 不显示矩阵的第1行
## [,1] [,2] [,3]
## [1,]2 5 8
## [2,]3 6 8
x[,-(1:2)] # 不显示矩阵的第1,2列
## [1] 7 8 8
z<-x[,-(1:2),drop=FALSE] #不显示矩阵x的第1,2列,并且返回为一矩阵y
z
## [,1]
## [1,] 7
## [2,] 8
## [3,] 8
3.4 提取矩阵的行或列
nrow与ncol函数: nrow与ncol函数返回行或列的某一个数字。
NCOL****与NROW用于向量,即把向量作为单行的矩阵处理。
用法: nrow(x) ncol(x) NCOL(x) NROW(x)
参数: x:向量,或数据框; 值:长度为1或无的整数; 类似的有dim函数
ma <- matrix(1:12, 3, 4);ma # 建矩阵3行4列的矩阵
## [,1] [,2] [,3] [,4]
## [1,]1 4 710
## [2,]2 5 811
## [3,]3 6 912
nrow(ma) # 行数为3
## [1] 3
ncol(ma) # 列数为4
## [1] 4
y <-array(1:24, dim = 2:4);y # 建2行4列的数组
## , , 1
##
## [,1] [,2] [,3]
## [1,]1 3 5
## [2,]2 4 6
##
## , , 2
##
## [,1] [,2] [,3]
## [1,]7 9 11
## [2,]8 10 12
##
## , , 3
##
## [,1] [,2] [,3]
## [1,]13 15 17
## [2,]14 16 18
##
## , , 4
##
## [,1] [,2] [,3]
## [1,]19 21 23
## [2,]20 22 24
ncol(y)
## [1] 3
NCOL(1:12) # NCOL把数组作为单行的矩阵处理
## [1] 1
NROW(1:12) # 12
## [1] 12
4. 矩阵的运算
4.1 矩阵相乘 %*%
只有当矩阵a的列数与矩阵b的行数相等时a×b才有意义。
一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足矩阵乘法满足结合律,但不满足交换律。
运算的法则:
矩阵a的第1行的3个元素(1,2,3)分别与矩阵b第1列的3个元素(1,2,3)相乘,其和为结果为e[1,1],即e[1,1]=1×1+2×2+3×3=14;
矩阵a的第1行的3个元素(1,2,3)分别与矩阵b第2列的3个元素(4,5,6)相乘1×4+2×5+3×6=32,得到e[1,2];
矩阵a的第2行的3个元素(4,5,6)分别与矩阵b第1列的3个元素(1,2,3)相乘4×1+5×2+6×3=32,得到e[2,1];
矩阵a的第2行的3个元素(4,5,6)分别与矩阵b第2列的3个元素(4,5,6)相乘4×4+5×5+6×6=77,得到e[2,2].
a
## A B C
## a 1 2 3
## b 4 5 6
d <- c(1:6)
d <- matrix(d,nrow=3)
d
## [,1] [,2]
## [1,]1 4
## [2,]2 5
## [3,]3 6
e<-a%*%d
e
## [,1] [,2]
## a 14 32
## b 32 77
4.2 矩阵合并
m1<-matrix(1,nrow=2,ncol=2)
m1 # 建立矩阵m1,2行2列,值为1
## [,1] [,2]
## [1,]1 1
## [2,]1 1
m2<-matrix(2,nrow=2,ncol=2)
m2 # 建立矩阵m2,2行2列,值为2
## [,1] [,2]
## [1,]2 2
## [2,]2 2
m_rbind<-rbind(m1,m2);m_rbind # 对两个矩阵m1,m2进行行合并,即上下合并
## [,1] [,2]
## [1,]1 1
## [2,]1 1
## [3,]2 2
## [4,]2 2
m_cbind<-cbind(m1,m2);m_cbind #对两个矩阵m1,m2进行列合并,即左右合并
## [,1] [,2] [,3] [,4]
## [1,]1 1 22
## [2,]1 1 22
4.3 星号
把两个矩阵中每个对应的元素相乘,例子中a与b拥有相同的维度
a
## A B C
## a 1 2 3
## b 4 5 6
b
## col_1 col_2 col_3
## row_12 4 6
## row_23 5 7
result<-a*b #将矩阵a与矩阵b相乘,并将其结果给result
result
## A B C
## a 2 8 18
## b 12 25 42
4.4 增加行与列
f<-matrix(,4,2) # 建立4行2列的空矩阵f
f
## [,1] [,2]
## [1,]NA NA
## [2,]NA NA
## [3,]NA NA
## [4,]NA NA
f[c(1,3),]<-matrix(c(1,2,3,4)) #取f的1行与3行,将向量(1,2,3,4)填充进去,默认按列填充
f
## [,1] [,2]
## [1,]1 3
## [2,]NA NA
## [3,]2 4
## [4,]NA NA
g<-matrix(,4,2)
g
## [,1] [,2]
## [1,]NA NA
## [2,]NA NA
## [3,]NA NA
## [4,]NA NA
g[c(1,3),]<-matrix(c(1,2,3,4),byrow=FALSE) # byrow=FALSE则按行填充
g
## [,1] [,2]
## [1,]1 3
## [2,]NA NA
## [3,]2 4
## [4,]NA NA
4.5 矩阵转置
f
## [,1] [,2]
## [1,]1 3
## [2,]NA NA
## [3,]2 4
## [4,]NA NA
h<-t(f)
h
## [,1] [,2] [,3] [,4]
## [1,]1 NA 2NA
## [2,]3 NA 4NA
4.6 取对角元素
j<-c(1,2,3,4,5,6,7,8,9)
j # 建立向量j
## [1] 1 2 3 4 5 6 7 8 9
j<-matrix(j,nrow=3)
j #建立3行3列矩阵
## [,1] [,2] [,3]
## [1,]1 4 7
## [2,]2 5 8
## [3,]3 6 9
j_diag<-diag(j) #取对角
j_diag
## [1] 1 5 9
diag()函数其他用法
a <- c(1,4)
diag(a)
# [,1] [,2]
# [1,] 1 0
# [2,] 0 4
4.7 求各行与列的总和与均值
j
## [,1] [,2] [,3]
## [1,]1 4 7
## [2,]2 5 8
## [3,]3 6 9
rowSums(j) # 求各行的总和
## [1] 12 15 18
rowMeans(j) # 求行的均值
## [1] 4 5 6
colSums(j) #求各列的总和
## [1] 6 15 24
colMeans(j) #求各列的均值
## [1] 2 5 8
4.8 矩阵的特征值与特征向量
矩阵A的谱分解为A=UΛU,其中Λ是由A的特征值组成的对角矩阵,U的列为A的特征值对应的特征向量,在R中可以使用eigen()得到U和A,eigen(x,symmertic, only.values=FALSE,EISPACK=FALSE)
其中参数symmetric项是逻辑值,是F或T,它用于指定矩阵x是否为对称矩阵,如果不指定,系统将自动检验x是否为对称矩阵
eigen(j)
# ?eigen() decomposition
# $values
# [1] 1.611684e+01 -1.116844e+00 -5.700691e-16
# $vectors
# [,1] [,2] [,3]
# [1,] -0.4645473 -0.8829060 0.4082483
# [2,] -0.5707955 -0.2395204 -0.8164966
# [3,] -0.6770438 0.4038651 0.4082483
4.9 矩阵的求逆
a<-matrix(1:8,2,4)
b<-matrix(2:9,4,2)
e<-a%*%b ## a的行数与b的列数相同
a
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
b
## [,1] [,2]
## [1,] 2 6
## [2,] 3 7
## [3,] 4 8
## [4,] 5 9
e
## [,1] [,2]
## [1,] 66 130
## [2,] 80 160
solve(e)
## [,1] [,2]
## [1,] 1.0 -0.8125
## [2,] -0.5 0.4125
参考:RVDSD的个人笔记
### 矩阵的choleskey分解
### 矩阵奇异值分解
### 矩阵QR分解
### 矩阵kronecker积
笔记参考:R语言基础--数据类型之矩阵