R语言(2)——矩阵

来源:互联网 发布:马勒 交响曲 知乎 编辑:程序博客网 时间:2024/05/17 09:11


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    8x    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 0
原创粉丝点击