有没有办法只使用 matrix() 命令创建对角矩阵?

问题描述 投票:0回答:3

我已经知道如何使用 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
r
3个回答
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


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)

0
投票

遵循您要求的逻辑

> +(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
© www.soinside.com 2019 - 2024. All rights reserved.