在R中创建特定矩阵

在R中创建特定矩阵,r,R,我想创建以下矩阵 A <- matrix(0,n,n) for(i in 1:n){ for(j in 1:n){ if(abs(i - j) == 1) A1[i,j] <- 1 } } A 创建一个值为0的矩阵 用列索引减去行索引 将矩阵中的值替换为差值为1或-1的值 您可以使用函数stats::toeplitz来减少代码量,该函数遵循了Ronak Shah在答案中的思想 f1 <- function(n) { A <- matrix(0,n,n

我想创建以下矩阵

A <- matrix(0,n,n)
for(i in 1:n){
  for(j in 1:n){
    if(abs(i - j) == 1) A1[i,j] <- 1
  }
}
A
  • 创建一个值为0的矩阵
  • 用列索引减去行索引
  • 将矩阵中的值替换为差值为1或-1的值

  • 您可以使用函数
    stats::toeplitz
    来减少代码量,该函数遵循了Ronak Shah在答案中的思想

    f1 <- function(n)
    {
      A <- matrix(0,n,n)
      inds <- row(A) - col(A)
      A[abs(inds) == 1] <- 1
      A
    }
    
    n <- 10
    A1 <- f1(n)
    A2 <- toeplitz(c(0,1,rep(0,n-2)))
    all.equal(A1, A2)
    #[1] TRUE
    

    f1一个简单的选项是使用
    outer
    +
    abs

    > +(abs(outer(1:n,1:n,`-`))==1)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7]
    [1,]    0    1    0    0    0    0    0
    [2,]    1    0    1    0    0    0    0
    [3,]    0    1    0    1    0    0    0
    [4,]    0    0    1    0    1    0    0
    [5,]    0    0    0    1    0    1    0
    [6,]    0    0    0    0    1    0    1
    [7,]    0    0    0    0    0    1    0
    

    其中
    n使用
    tidyverse
    -
    交叉
    获得序列的组合,然后 获取各列之间的绝对差值(
    -
    ),检查其是否等于1,并使用
    枢轴_加宽

    library(dplyr)
    library(tidyr)
    crossing(n1 = 1:n, n2 = 1:n) %>% 
        mutate(new = +(abs((n1 - n2)) == 1)) %>% 
        pivot_wider(names_from = n2, values_from = new)
    
    -输出

    # A tibble: 5 x 6
    #     n1   `1`   `2`   `3`   `4`   `5`
    #  <int> <int> <int> <int> <int> <int>
    #1     1     0     1     0     0     0
    #2     2     1     0     1     0     0
    #3     3     0     1     0     1     0
    #4     4     0     0     1     0     1
    #5     5     0     0     0     1     0
    
    #      [,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
    
    -输出

    # A tibble: 5 x 6
    #     n1   `1`   `2`   `3`   `4`   `5`
    #  <int> <int> <int> <int> <int> <int>
    #1     1     0     1     0     0     0
    #2     2     1     0     1     0     0
    #3     3     0     1     0     1     0
    #4     4     0     0     1     0     1
    #5     5     0     0     0     1     0
    
    #      [,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
    
    #      [,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