矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数。所以矩阵也是和向量一样,有模式(数据类型)的概念。(但反过来,向量却不能看作是只有一列或一行的矩阵。
数组(array)是R里更一般的对象,矩阵是数组的一个特殊情形。数组可以是多维的。例如:一个三维数组可以包含行、列和层(layer),而一个矩阵只有行和列两个维度
1、创建矩阵
矩阵的行和列的下标都是从1开始,如:矩阵a左上角的元素记作a[1,1]。矩阵在R中是按列存储的,也就是说先存储第一列,再存储第二列,以此类推。
> 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[,2] #输出第二列
[1] 3 4
>
为矩阵中的元素赋值
> y <- matrix(nrow = 2,ncol = 2)
> y
[,1] [,2]
[1,] NA NA
[2,] NA NA
> y[1,1] <- 1
> y[2,1] <- 2
> y[1,2] <- 3
> y[2,2] <-4
> 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
>
默认在R中矩阵是以列进行存储的,但通过byrow = T,参数可以将矩阵进行按行存储
> y <- matrix(c(1,2,3,4),nrow = 2, byrow = T)
> y
[,1] [,2]
[1,] 1 2
[2,] 3 4
>
2、一般矩阵运算
常用的矩阵运算:线性代数运算、矩阵索引、矩阵元素筛选
#线性代数运算
线性代数运算包括:矩阵相乘、矩阵数量乘法、矩阵加法等
> y <- matrix(c(1,2,3,4),nrow = 2)
> y
[,1] [,2]
[1,] 1 3
[2,] 2 4
> y %*% y #矩阵相乘
[,1] [,2]
[1,] 7 15
[2,] 10 22
> 3*y #矩阵数量乘法
[,1] [,2]
[1,] 3 9
[2,] 6 12
> y+y #矩阵加法
[,1] [,2]
[1,] 2 6
[2,] 4 8
>
#矩阵索引
> z <- matrix(c(1,2,3,4,1,1,0,0,1,0,1,0),nrow = 4)
> z
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 0 1
[4,] 4 0 0
> z[,2:3] #提取z中第2、3更
[,1] [,2]
[1,] 1 1
[2,] 1 0
[3,] 0 1
[4,] 0 0
>
给矩阵赋值
> z
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 0 1
[4,] 4 0 0
> z[c(1,3),] <-matrix(c(1,1,8,12,16,20),nrow = 2) #给z1,3行进行赋新值
> z
[,1] [,2] [,3]
[1,] 1 8 16
[2,] 2 1 0
[3,] 1 12 20
[4,] 4 0 0
>
利用行号负值,移除行或列
> y <- matrix(c(1,2,3,4,5,6),nrow = 3)
> y
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> y[-2,] #移除第2行
[,1] [,2]
[1,] 1 4
[2,] 3 6
> y[,-2] #移除第2列
[1] 1 2 3
>
#矩阵元素筛选
矩阵跟向量样也可以进行筛选,只是语法上不同而已
> x <-matrix(c(1,2,3,2,3,4),nrow = 3)
> x
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
> x[x[,2]>=3,] #x中第2列所有大于等于3的行
[,1] [,2]
[1,] 2 3
[2,] 3 4
>
矩阵筛选规则可以基于除被筛选变量这外的变量
> x
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
> z <- c(5,12,13)
> x[z %% 2 == 1,]
[,1] [,2]
[1,] 1 2
[2,] 3 4
>
运算符:& and && 前者是向量的逻辑“与”运算,后者是用于if语句的标量逻辑“与”运算
> m <- matrix(c(1,2,3,4,5,6),nrow = 3)
> m
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> m[m[,1]>1 & m[,2]>5] #m中第1列中大于1,第2列中大于5的行
[1] 3 6
>
#扩展案例:生成协方差矩阵
n元正态分布,协方差矩阵有n行n列,要求n个随机变量方差都为1,每两个变量间的相关性都是rho,如:当n=3,rho=0.2时,需要的矩阵如下:

> makecov <- function(rho,n){
m<-matrix(nrow = n,ncol = n)
m<-ifelse(row(m)==col(m),1,rho)
return(m)
}
> makecov(0.2,3)
[,1] [,2] [,3]
[1,] 1.0 0.2 0.2
[2,] 0.2 1.0 0.2
[3,] 0.2 0.2 1.0
>
3、对矩阵的行和列调用函数
原文:http://www.cnblogs.com/aipeli/p/6266954.html