从向量到R中的矩阵

时间:2019-02-08 19:17:41

标签: r matrix

我有一个从1到105的数字列表。我想移到带有对角线值的较低三角形矩阵。但是,我不希望此矩阵按行填充,而是希望使用以下模式:

enter image description here

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

现有功能(例如lower.trimatrix(x, byrow=TRUE)在这里似乎不起作用,因此我对如何实现这一点感到迷茫。

x <- c(1:105)

编辑:

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

EDIT2:

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

1 个答案:

答案 0 :(得分:0)

编辑:自动方式

这里的功能应该照顾您的要求...

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