R 在矩阵中沿对角线设置值

R 在矩阵中沿对角线设置值,r,matrix,R,Matrix,我试图使用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的对角线,一条在主对角线的左边,一条在主对角线的右边。我们可以用一个数学技巧创建一个函数,它适用于所有平方矩阵 get_off_diagonal_1s <- function(n) { #Cre

我试图使用
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的对角线,一条在主对角线的左边,一条在主对角线的右边。

我们可以用一个数学技巧创建一个函数,它适用于所有平方矩阵

get_off_diagonal_1s <- function(n) {
  #Create a matrix with all 0's
  mat <- matrix(0, ncol = n, nrow = n)
  #Subtract row indices by column indices
  inds = row(mat) - col(mat)
  #Replace values where inds is 1 or -1
  mat[inds == 1 | inds == -1] = 1
  mat
}

get_off_diagonal_1s(5)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    1    0    0    0
#[2,]    1    0    1    0    0
#[3,]    0    1    0    1    0
#[4,]    0    0    1    0    1
#[5,]    0    0    0    1    0

get_off_diagonal_1s(8)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    0    1    0    0    0    0    0    0
#[2,]    1    0    1    0    0    0    0    0
#[3,]    0    1    0    1    0    0    0    0
#[4,]    0    0    1    0    1    0    0    0
#[5,]    0    0    0    1    0    1    0    0
#[6,]    0    0    0    0    1    0    1    0
#[7,]    0    0    0    0    0    1    0    1
#[8,]    0    0    0    0    0    0    1    0

get_off_diagonal_1s对于主对角线,行和列索引是相同的。对于其他对角线,行索引和列索引之间的差异为
1
。直接生成这些索引并在这些索引中赋值

sz = 5
m = matrix(0, sz, sz)
inds1 = cbind(r = 1:(sz-1), c = 2:sz)
inds2 = cbind(r = 2:sz, c = 1:(sz-1))
m[inds1] = 1
m[inds2] = 1
m

# OR, to make it concise
m = matrix(0, sz, sz)
inds = rbind(cbind(1:(sz-1), 2:sz), cbind(2:sz, 1:(sz-1)))
replace(m, inds, 1)

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    1    0    0    0
#[2,]    1    0    1    0    0
#[3,]    0    1    0    1    0
#[4,]    0    0    1    0    1
#[5,]    0    0    0    1    0

diag()
函数(实际上,
diagI可能需要一些搜索,但是矩阵包往往有很多函数,用于创建各种常见模式下的矩阵,如下图所示。
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
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