我已经知道如何使用 for 循环创建对角矩阵。我只是好奇我是否可以只用这样一行得到相同的结果:
row <- 5
col <- 5
matrix(data = if (row == col) {1} else {0}, nrow = row, ncol = col)
想要的结果:
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
我目前的逻辑是,如果行和列相等,则用 1 填充每个元素,否则为 0。
到目前为止它似乎没有捕捉到我的 else 语句:
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 1 1 1 1 1
[3,] 1 1 1 1 1
[4,] 1 1 1 1 1
[5,] 1 1 1 1 1
> diag(5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
或者如果你必须使用
matrix
功能..
> matrix(diag(5), nrow=5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
或与
outer
(可能最接近您的行==列逻辑)
> outer(1:5,1:5,\(x,y) as.numeric(x==y))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
再次使用
matrix
,这就是您正在尝试的,不同的 rep
s 代表行和列索引:
> matrix(as.numeric(rep(1:5,5)==rep(1:5,each=5)), nrow=5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
R 提供 diag 来执行此操作,但假设不允许这样做,那么如果可以使用 rep、c 和 *,那么
matrix(rep(c(1, rep(0, 5)), length = 5 * 5), 5)
给予
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
如果替换,cbind 和 : 可以使用 then
replace(matrix(0, 5, 5), cbind(1:5, 1:5), 1)
遵循您要求的逻辑
> +(row(. <- matrix(NA, n, n)) == col(.))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1