我是靠谱客的博主 聪慧季节,最近开发中收集的这篇文章主要介绍R函数-diag(),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

最后

以上就是聪慧季节为你收集整理的R函数-diag()的全部内容,希望文章能够帮你解决R函数-diag()所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部