形象些表述,一维、两维、三维。
矩阵,行*列
matrix
z<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),nrow=6,ncol=2)
> z<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),nrow=6,ncol=2)
> z
[,1] [,2]
[1,] 1 7
[2,] 2 8
[3,] 3 9
[4,] 4 10
[5,] 5 11
[6,] 6 12
> z<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),nrow=6)
> z
[,1] [,2]
[1,] 1 7
[2,] 2 8
[3,] 3 9
[4,] 4 10
[5,] 5 11
[6,] 6 12
> z<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),ncol=2)
> z
[,1] [,2]
[1,] 1 7
[2,] 2 8
[3,] 3 9
[4,] 4 10
[5,] 5 11
[6,] 6 12
填充方式:R默认按列填充矩阵中的元素
byrow
例子:
> z<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),ncol=2,byrow=TRUE)
> Z
错误: 找不到对象'Z'
> z<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),ncol=2,byrow=FALSE)
> Z
错误: 找不到对象'Z'
> z
[,1] [,2]
[1,] 1 7
[2,] 2 8
[3,] 3 9
[4,] 4 10
[5,] 5 11
[6,] 6 12
> z<-matrix(data=c(1,2,3,4,5,6,7,8,9,10,11,12),ncol=2,byrow=TRUE)
> z
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10
[6,] 11 12
合并行和列
rbind
cbind
v1<-1:3
v2<-4:6
v3<-rbind(v1,v2)
执行:
> v1<-1:3
>
> v2<-4:6
>
> v3<-rbind(v1,v2)
> v3
[,1] [,2] [,3]
v1 1 2 3
v2 4 5 6
> v4<-cbind(v1,v2)
> v4
v1 v2
[1,] 1 4
[2,] 2 5
[3,] 3 6
或者rbind(1:3,4:6)
> rbind(1:3,4:6)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
实验性,但不知道结果意味着什么
> rbind(1:3,4:6,byrow=TRUE)
[,1] [,2] [,3]
1 2 3
4 5 6
byrow 1 1 1
> v4<-cbind(v1,v2,byrow=TRUE)
> V4
错误: 找不到对象'V4'
> v4
v1 v2 byrow
[1,] 1 4 1
[2,] 2 5 1
[3,] 3 6 1
矩阵的维度
dim
> dim(v3)
[1] 2 3
> dim(v3)[2]
[1] 3
> ncol(v3)
[1] 3
构造子集
在矩阵中提取元素仍使用中括号,但是要严格按照顺序[行,列]来说明元素的位置。
> v3
[,1] [,2] [,3]
v1 1 2 3
v2 4 5 6
> x<-v3[2,2]
> x
v2
5
> x2<-v3[3,1]
Error in v3[3, 1] : 下标出界#颠倒了行数与列数
> x2<-v3[1,3]
> x2
v1
3
从一个矩阵中提取整行或整列
实例:
> x3<-v3[,3]#虽为空值,但无须空格
> x3
v1 v2
3 6
说明,无论是提取单个数值还是整行,R都会返回一个独立的向量。进行复杂的提取,范围结果一定是具有适当维度的新矩阵。
> x4<-v3[,2:3]
> x4
[,1] [,2]
v1 2 3
v2 5 6
> x5<-v3[,c(1,3)]
> X5
错误: 找不到对象'X5'
> x5
[,1] [,2]
v1 1 3
v2 4 6
> x6<-diag(x=v3)
> x6
[1] 1 5
diag命令用于提取方阵(也就是行数和列数相同的矩阵)中对角线的元素。
省略和改写
> v3<-cbing(v1[,1],sort(v1[,2]))
Error in cbing(v1[, 1], sort(v1[, 2])) : 没有"cbing"这个函数
> v3<-cbind(v1[,1],sort(v1[,2]))
> v3
[,1] [,2]
[1,] 4.3 0.9
[2,] 3.1 1.6
[3,] 8.2 3.2
[4,] 8.2 6.5
> v4<-v3[-4,-1]
> v4
[1] 0.9 1.6 3.2
> matrix(data=v4[-4,-1])
Error in v4[-4, -1] : 量度数目不对
> matrix(data=v3[-4,-1])#删除某个元素,且保持其为矩阵。
[,1]
[1,] 0.9
[2,] 1.6
[3,] 3.2
> v5<-matrix(data=v3[1:4,2],nrow=2)
> v5
[,1] [,2]
[1,] 0.9 3.2
[2,] 1.6 6.5
v3[c(4,1),c(2,1)]<-diag(v5)
> v6<-v3
> v6
[,1] [,2]
[1,] 4.3 0.9
[2,] 3.1 1.6
[3,] 8.2 3.2
[4,] 8.2 6.5
> v6[c(4,1),c(2,1)]<-diag(v5)
> v6
[,1] [,2]
[1,] 6.5 6.5
[2,] 3.1 1.6
[3,] 8.2 3.2
[4,] 0.9 0.9
> v6[c(4,1),c(1,2)]<-diag(v5)
> v6
[,1] [,2]
[1,] 6.5 6.5
[2,] 3.1 1.6
[3,] 8.2 3.2
[4,] 0.9 0.9
> v6[c(1,4),c(1,2)]<-diag(v5)
> v6
[,1] [,2]
[1,] 0.9 0.9
[2,] 3.1 1.6
[3,] 8.2 3.2
[4,] 6.5 6.5
> v6[c(4,1),2:1]<-diag(v5)*(-1/2)
> v6
[,1] [,2]
[1,] -3.25 -3.25
[2,] 3.10 1.60
[3,] 8.20 3.20
[4,] -0.45 -0.45
从两方面来考虑R中的矩阵。这两方面非常重要,因为矩阵的数学运算和一般数学运算并不完全一致。(根据使用的需要来进行掌握,初期了解一些有助于了解研究中数据的数学处理。)
转置
t
> t(v6)
[,1] [,2] [,3] [,4]
[1,] -3.25 3.1 8.2 -0.45
[2,] -3.25 1.6 3.2 -0.45
单位矩阵
> v7<-diag(x=7)
> v7
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0
[3,] 0 0 1 0 0 0 0
[4,] 0 0 0 1 0 0 0
[5,] 0 0 0 0 1 0 0
[6,] 0 0 0 0 0 1 0
[7,] 0 0 0 0 0 0 1
矩阵的数乘
矩阵的加减法
矩阵的乘法?
dim,%*%
逆矩阵
solve
向量和矩阵可以认为是更一般数组的特殊情况。这里的数组指维数超过2的数据结构类型。多出来的一个维度相当于层,然后是块数……。
行*列*层
array
> v1<-array(data=1:24,dim=c(3,4,2))
> v1
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
> v2<-array(data=rep(1:24,times=3),dim=c(3,4,2,3))
> v2
, , 1, 1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2, 1
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
, , 1, 2
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2, 2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
, , 1, 3
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2, 3
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
子集、提取和替换
提取的行不一定以行的形式给出,影响?
如果要从多个d维中提取元素,结果将是一个更高维的数组,即d+1维数组。