【问题标题】:Creating a matrix of increasing concentric rings of numbers in R在R中创建一个增加同心数字环的矩阵
【发布时间】:2015-11-12 21:45:04
【问题描述】:

我需要在 R 中编写一个函数来创建一个由越来越多的同心数字环组成的矩阵。该函数的参数是多个层。例如,如果 x = 3,矩阵将如下所示:

1 1 1 1 1  
1 2 2 2 1  
1 2 3 2 1  
1 2 2 2 1  
1 1 1 1 1

我不知道该怎么做。如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    1)试试这个:

    x <- 3 # input
    
    n <- 2*x-1
    m <- diag(n)
    x - pmax(abs(row(m) - x), abs(col(m) - x))
    

    给予:

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

    2)第二种方法是:

    x <- 3 # input
    
    n <- 2*x-1
    mid <- pmin(1:n, n:1)  # middle row/column
    outer(mid, mid, pmin)
    

    给出与以前相同的结果。

    3) 与前两种方法有一些相似之处的另一种方法是:

    x <- 3 # input
    
    n <- 2*x-1
    Dist <- abs(seq_len(n) - x)
    x - outer(Dist, Dist, pmax)
    

    注意:上面给出了问题中显示的样本矩阵,但问题的主题说环应该增加,这可能意味着从中心到外部增加,所以如果这是想要然后试试这个mmidDist和以前一样:

    pmax(abs(row(m) - x), abs(col(m) - x)) + 1
    

    x - outer(mid, mid, pmin) + 1
    

    outer(Dist, Dist, pmax) + 1
    

    其中任何一个都给出:

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

    【讨论】:

      【解决方案2】:

      试试这个:

      x<-3
      res<-matrix(nrow=2*x-1,ncol=2*x-1)
      for (i in 1:x) res[i:(2*x-i),i:(2*x-i)]<-i
      res
      #     [,1] [,2] [,3] [,4] [,5]
      #[1,]    1    1    1    1    1
      #[2,]    1    2    2    2    1
      #[3,]    1    2    3    2    1
      #[4,]    1    2    2    2    1
      #[5,]    1    1    1    1    1
      

      【讨论】:

        【解决方案3】:

        踢的递归解决方案(仅奇数)

        f <- function(n) if (n == 1) 1 else `[<-`(matrix(1,n,n), 2:(n-1), 2:(n-1), 1+Recall(n-2))
        
        f(5)
        
        #      [,1] [,2] [,3] [,4] [,5]
        # [1,]    1    1    1    1    1
        # [2,]    1    2    2    2    1
        # [3,]    1    2    3    2    1
        # [4,]    1    2    2    2    1
        # [5,]    1    1    1    1    1
        

        【讨论】:

          【解决方案4】:

          这是逻辑,在R中自己实现。

          • 创建一个矩阵,其行数和列数等于 2*x-1 和 用零填充它并开始从 (0,0) 遍历数组到 (2*x-2,2*x-2)。
          • 现在,在每个单元格中,计算单元格的“级别”。的水平 单元格是距离它的四个边界最近的距离 矩阵,即 min(i,j,2*x-2-i,2*x-2-j)。
          • 此“级别”值是要放入单元格中的值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多