首页 > 解决方案 > 在R中从向量移动到矩阵

问题描述

我有一个从 1 到 105 的数字列表。我想移动到具有对角线值的下三角矩阵。但是,我不希望这个矩阵按行填充,而是我想要以下模式:

在此处输入图像描述

该矩阵中的数字是指我希望在矩阵中看到的列表 (x) 中的元素。例如,我的列表中的数字 64 应该位于矩阵的左下角。

现有的功能(喜欢lower.trimatrix(x, byrow=TRUE)似乎不在这里工作,所以我有点迷失在如何处理这个问题。

x <- c(1:105)

编辑:

请注意,图像中的矩阵有“怪癖”。通过查看第 6 列和第 7 列可以最好地说明这些。第 7 行中的值从 27 到 70,第 8 行中的值从 33 到 71 等等。同样,事情发生在第 12 列和第 13 列之间,其中第 13 行中的值从 96 到 103,在第 14 行中从 102 到 104。

编辑2:

来自评论:我能想到的唯一真正的规则是,在每 6 列之后,“怪异”就会发生。使用 13x13 矩阵而不是 70 它将是 64,使用 12x12 它将是 58,依此类推,所以它减少了 6。对于 14x14 矩阵,显然有 14 列,因此在第 6 列之后,分列会发生两次,在第 12 列之后。对于 19x19 矩阵,我们将出现 3 次分栏 - 在第 6、第 12 和第 18 之后。我提出这个是因为不寻常的值会在每个分栏后开始

标签: rmatrix

解决方案


编辑:自动方式

这是一个应该照顾你所要求的功能......

code_matrix <- function(p, change_col = 6) {
  # we will create the transpose of the desired matrix first
  # this handles the row wise assignment

  # initialize your matrix
  m <- matrix(0, p, p)

  # create a logical upper triangular to track where we will put values
  a <- matrix(T, p, p)
  a[lower.tri(a)] <- F

  # tracks what the last number from the prior block was
  end_num <- 0

  # how many blocks of columns to divide things into based on the rule
  m_blocks <- 1:ceiling(p / change_col)

  # loop through each of the blocks
  for (i in m_blocks) {

    # calculate the start and end rows in the block
    start_row <- (i - 1) * change_col + 1
    end_row <- min(start_row + (change_col - 1), p)

    # create the sequence of numbers
    v <- end_num + 1:sum(a[start_row:end_row,])

    # store the sequence back into the matrix by using the logical matrix
    m[start_row:end_row,][a[start_row:end_row,]] <- v

    # increase the tracker  
    end_num <- max(v)
  }

  return(t(m))
}

给它一个测试...

> code_matrix(14)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
 [1,]    1    0    0    0    0    0    0    0    0     0     0     0     0     0
 [2,]    2    3    0    0    0    0    0    0    0     0     0     0     0     0
 [3,]    4    5    6    0    0    0    0    0    0     0     0     0     0     0
 [4,]    7    8    9   10    0    0    0    0    0     0     0     0     0     0
 [5,]   11   12   13   14   15    0    0    0    0     0     0     0     0     0
 [6,]   16   17   18   19   20   21    0    0    0     0     0     0     0     0
 [7,]   22   23   24   25   26   27   70    0    0     0     0     0     0     0
 [8,]   28   29   30   31   32   33   71   72    0     0     0     0     0     0
 [9,]   34   35   36   37   38   39   73   74   75     0     0     0     0     0
[10,]   40   41   42   43   44   45   76   77   78    79     0     0     0     0
[11,]   46   47   48   49   50   51   80   81   82    83    84     0     0     0
[12,]   52   53   54   55   56   57   85   86   87    88    89    90     0     0
[13,]   58   59   60   61   62   63   91   92   93    94    95    96   103     0
[14,]   64   65   66   67   68   69   97   98   99   100   101   102   104   105

推荐阅读