R语言笔记之数据类型4-矩阵
矩阵
矩阵定义
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数
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 ),默认情况下按列填充。
创建矩阵
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
矩阵命名
用法: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<-c(2,3,4,5,6,7) # 建立向量b
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
查看矩阵
查看矩阵的列/行相关信息
colnames(a) # 查看矩阵列名
## [1] "A" "B" "C"
rownames(a) # 查看矩阵行名
## [1] "a" "b"
查看矩阵的维度
dim(a) # 返回行与列数
## [1] 2 3
nrow(a) # 返回行数
## [1] 2
ncol(a) # 返回列数
## [1] 3
条件提取子矩阵
a # 查看矩阵a
## A B C
## a 1 2 3
## b 4 5 6
a[2,3] #取矩阵a的第2列,第3个元素
## [1] 6
a[,1] #取矩阵a的第1列
## a b
## 1 4
a[1,] # 取矩阵a的第1行
## A B C
## 1 2 3
c<-a[a[,2]>4] # 取矩阵a第2行并且大于4的元素,并将其赋值给c
c
## [1] 4 5 6
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
提取矩阵的行或列
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
矩阵的运算
矩阵相乘%*%
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
只有当矩阵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].
矩阵合并
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
星号
把两个矩阵中每个对应的元素相乘,例子中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
如果维度不同,如下所示:
a
## A B C
# a 1 2 3
## b 4 5 6
c
## [1] 4 5 6
a*c # a矩阵中的每一列与c的每一行相乘,循环c
## A B C
## a 4 12 15
## b 20 20 36
增加行与列
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
矩阵转置
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
取对角元素
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
求各行与列的总和与均值
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
矩阵的特征值与特征向量
矩阵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
矩阵的求逆
矩阵求逆可用函数solve(),应用sovle(A,b)运算结果可以解线性方程组Ax=b,缺b缺少,则系统默认为单位矩阵,因此可以用其进行矩阵求逆,如下所示:
e
[,1] [,2]
a 15 36
b 29 71
solve(e)
a b
[1,] 3.380952 -1.7142857
[2,] -1.380952 0.7142857
矩阵的Choleskey分解
对于正定矩阵A,可对其进行Choleskey分解,即A=P’P,其中P为上三角矩阵,在R中可以用函数chol()进行Choleskey分解,如下所示:
等待更新
mark
### 矩阵奇异值分解
### 矩阵QR分解
### 矩阵kronecker积