我正在尝试使用 matrix()
和 diag()
函数来创建以下模式,但使用 100 x 100 矩阵而不是 5 x 5。
5 x 5 矩阵:
| 0 1 0 0 0 |
| 1 0 1 0 0 |
| 0 1 0 1 0 |
| 0 0 1 0 1 |
| 0 0 0 1 0 |
换句话说,我想要两条值为 1 的对角线,一条在主对角线的左侧,一条在主对角线的右侧。
最佳答案
可以使用 diag()
函数(实际上是 diag<-
函数)进行赋值:
mat <- matrix( 0, 100,100)
diag(mat) <- 1
mat[1:10,1:10]
#-----------
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 0
[3,] 0 0 1 0 0 0 0 0 0 0
[4,] 0 0 0 1 0 0 0 0 0 0
[5,] 0 0 0 0 1 0 0 0 0 0
[6,] 0 0 0 0 0 1 0 0 0 0
[7,] 0 0 0 0 0 0 1 0 0 0
[8,] 0 0 0 0 0 0 0 1 0 0
[9,] 0 0 0 0 0 0 0 0 1 0
[10,] 0 0 0 0 0 0 0 0 0 1
但是,您希望为次对角线和超对角线分配值,因此请使用
col
和 row
的逻辑表达式:mat <- matrix( 0, 100,100)
mat[row(mat)==col(mat)-1] <- 1
mat[row(mat)==col(mat)+1] <- 1
mat[1:10,1:10]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 1 0 0 0 0 0 0 0 0
[2,] 1 0 1 0 0 0 0 0 0 0
[3,] 0 1 0 1 0 0 0 0 0 0
[4,] 0 0 1 0 1 0 0 0 0 0
[5,] 0 0 0 1 0 1 0 0 0 0
[6,] 0 0 0 0 1 0 1 0 0 0
[7,] 0 0 0 0 0 1 0 1 0 0
[8,] 0 0 0 0 0 0 1 0 1 0
[9,] 0 0 0 0 0 0 0 1 0 1
[10,] 0 0 0 0 0 0 0 0 1 0
(这个方法不依赖于有一个方阵。我有一个模糊的内存,有一个不需要使用
row
和 col
的更快的方法。对于非常大的对象,这些函数中的每一个都返回一个与它们的参数相同维度的矩阵.)关于r - 沿矩阵中的对角线设置值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54509990/