R语言(2)——矩阵


1 矩阵简述

矩阵本质上是一种向量,只是比向量多两个属性:行数和列数;矩阵也有模式:如字符型,数值型。

> m<-matrix(1:8,nrow=4)
> m
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
> nrow(m) #获取矩阵行数
[1] 4
> ncol(m) #获取矩阵列数
[1] 2
> dim(m) #获取行列数
[1] 4 2
> attributes(m) #显然矩阵是一个class,有自己的属性
$dim
[1] 4 2



2 创建矩阵

2.1 

#方法一,确定好矩阵的行、列数
> y<-matrix(c(1,2,3,4),nrow=2,ncol=2)
> y
     [,1] [,2]
[1,]    1    3
[2,]    2    4
#方法二,只确定矩阵的行数
> y<-matrix(c(1,2,3,4),nrow=2)
> y
     [,1] [,2]
[1,]    1    3
[2,]    2    4
#方法三,不填充数值向量,再后面的代码中填充
> y<-matrix(nrow=2,ncol=4)
> y
     [,1] [,2] [,3] [,4]
[1,]   NA   NA   NA   NA
[2,]   NA   NA   NA   NA
#方法四: 注意,将向量填充进矩阵时,默认都是按列排列向量的,而通过 <span style="font-family: Arial, Helvetica, sans-serif;">byrow=T, 可以将向量按行排列。</span>

> y<-matrix(1:8,nrow=2,byrow=T)
> y
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8


3矩阵的一般运算

3.1 矩阵乘法

# 矩阵乘法: %*%
> x<-matrix(1:8,nrow=4)
> x
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
> y<-matrix(1:8,nrow=2)
> y
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> y%*%x
     [,1] [,2]
[1,]   50  114
[2,]   60  140

3.2 矩阵的提取

#方法一:提取矩阵的二至四列
> y
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> y[,2:4]
     [,1] [,2] [,3]
[1,]    3    5    7
[2,]    4    6    8
#方法二:去掉矩阵的第一列
> y[,-1]
     [,1] [,2] [,3]
[1,]    3    5    7
[2,]    4    6    8

3.3 元素的筛选

#矩阵的筛选和向量类似,原理也相似
> y
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> y[,y[2,]>4]
     [,1] [,2]
[1,]    5    7
[2,]    6    8
#上述筛选方法的原理
> y[2,]>4
[1] FALSE FALSE  TRUE  TRUE


3.4 矩阵的行、列数的变化


矩阵不能增加一行(列)或删除一行(列),类似的功能需要对矩阵进行重新赋值的操作。

> y[2,3]<-4
> y
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    4    8


上述操作的本质就是创建一个新的矩阵,并将矩阵赋值给y。注意,这是一项看起来不起眼,但那时很耗时的操作,这类的操作出现在循环会消耗大量的时间。


> x<-1
> y
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    4    8
#给y添加一行
> rbind(y,x)
  [,1] [,2] [,3] [,4]
     1    3    5    7
     2    4    4    8
x    1    1    1    1
#给y添加一列
> cbind(y,x)
             x
[1,] 1 3 5 7 1
[2,] 2 4 4 8 1

#注意,上述操作中显然x的数量不足以填充y的一行或一列,但是R自动使用了循环赋值,及重复x的值,以使x中的元素达到需要的数量。

rbind(),cbind()的本质也是要创建一个新的矩阵,这是很费时的。


4 apply 函数

4.1 apply函数是用来对矩阵的每一行或每一列调用一次某个函数的函数,

apply(m,dimcode,f,fargs)

参数解释:

  • m为矩阵
  • dimcode是维度编号,取1表示对m矩阵中的每一行应用函数,取2代表对m矩阵中的每一列应用函数
  • f是应用在行或列上的函数
  • fargs是f的可选参数集
4.2 简单的实例

> y
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> mean(y)
[1] 4.5
> apply(y,1,mean)
[1] 4 5

5 避免意外降维

> y
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    4    8
> x<-y[1,]
> x
[1] 1 3 5 7
> attributes(x)
NULL

在上免得代码中,x是y矩阵的第一行,是y的子矩阵。x本质上是一个一行四列的矩阵。而,当我们从一种将x取出是,R自动将x降维成向量。虽然大多数情况下,并不应印象我们的操作和处理,但是在运行复杂代码时,可能会出现因此原因出现一些意想不到的错误。以此,要尽力避免这种意外降维。可采用如下方法,使R不自作主张的降维

> x<-y[1,,drop=FALSE]
> x
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值