矩阵和数组

形象些表述,一维、两维、三维。

矩阵,行*列

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维数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值