diag()提取或替换一个矩阵的对角线,或构造一个对角矩阵。
语法:
diag(x = 1, nrow, ncol)
diag(x) <- value
解析:
x:一个矩阵,向量或一维数组,或不填写。
nrow, ncol:可选 行列。
value :对角线的值,可以是一个值或一个向量。
例子
> x <- matrix(1:16,nrow=4,ncol=4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> diag(x)
[1] 1 6 11 16
#展示x的对角线数据
> diag(diag(x))
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
#由x的对角线数据生成对角矩阵
> diag(4)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 1 0 0
[3,] 0 0 1 0
[4,] 0 0 0 1
#对角线为4个元素每个元素默认为1的对角矩阵
> diag(10,3,4)
[,1] [,2] [,3] [,4]
[1,] 10 0 0 0
[2,] 0 10 0 0
[3,] 0 0 10 0
#对角线数据位10,三行四列的矩阵
> a<-diag(4)+1
> a
[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
看几个较复杂的例子
例1
> all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m})
[1] TRUE
吃瓜群众,表示不明白,拆开一点点看
1、大括号内:生成一个数值都是0的3*3矩阵m
> m <- matrix(0,3,3)
> m
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
2、将m的对角线数据赋值为1、2、3
> diag(m) <- 1:3
> m
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 2 0
[3,] 0 0 3
3、判断等式两边的矩阵数值是否相等
> diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m}
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
给个例子A看了就更清晰了
> diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 3:5; m}
[,1] [,2] [,3]
[1,] FALSE TRUE TRUE
[2,] TRUE FALSE TRUE
[3,] TRUE TRUE FALSE
all() 给定一组逻辑向量,判断所有的值都正确与否,全部相等返回TRUE
> all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 3:5; m})
[1] FALSE
> all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m})
[1] TRUE
例2
> diag(var(M <- cbind(X = 1:5, Y = stats::rnorm(5))))
X Y
2.5000000 0.6281205
拆开看看
1、取stats包中的5个随机数并赋值给Y
stats::rnorm
指定使用stats包里的rnorm函数,因为有可能同时多个包里有rnorm函数
> Y = stats::rnorm(5)
> Y
[1] 0.1492229 -0.2466619 1.3518855 0.5641860 -0.1353419
2、合并两个向量
> cbind(X = 1:5, Y = stats::rnorm(5))
X Y
[1,] 1 -2.5293372
[2,] 2 0.1422790
[3,] 3 -1.8053848
[4,] 4 0.8951704
[5,] 5 -1.5458680
3、将合并后的矩阵赋值给M并取矩阵M的方差
var()求方差
R语言的var计算的是样本方差
> var(M <- cbind(X = 1:5, Y = stats::rnorm(5)))
x y
x 2.5000000 0.1252164
y 0.1252164 0.8315106
疑问,矩阵的方差?如何计算呢?
> M
x y
[1,] 1 5
[2,] 2 6
[3,] 3 7
> var(M)
x y
x 1 1
y 1 1
4、所以这条语句的意思是取步骤3中矩阵的对角线
> diag(var(M <- cbind(X = 1:5, Y = stats::rnorm(5))))
x y
2.5000000 0.8315106
例3
> rownames(M) <- c(colnames(M),rep("",3))
> M
x y
x 1 -0.91441252
y 2 1.52303629
3 -0.41773804
4 -0.01641658
5 0.10574677
1、rep(“”,3) 把”“重复3次
> rep("",3)
[1] "" "" ""
2、colnames(M) 显示M的列名
> colnames(M)
[1] "X" "Y"
3、把M的行命名
> rownames(M) <- c(colnames(M),rep("",3))
> M
x y
x 1 -0.91441252
y 2 1.52303629
3 -0.41773804
4 -0.01641658
5 0.10574677