【问题标题】:Moving from a vector to a matrix in R在R中从向量移动到矩阵
【发布时间】:2019-02-08 19:17:40
【问题描述】:

我有一个从 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 之后。我提出这个是因为异常值会在每个分栏后开始

【问题讨论】:

  • 几件事。只是为了清理语言,你有一个数字向量,而不是数字列表。其次,这不是下三角矩阵。在下三角形中,对角线向量全为零。你的不是。你提前知道方阵的大小吗?或者你想从你的向量计算,x?这与这里的问题非常相似:stackoverflow.com/questions/30787317/…
  • 另外,您图片中的第 6 列和第 7 列之间发生了什么?为什么逐行模式会改变?准确吗?
  • 亚当,感谢您在语言方面帮助我。我如何调用一个下对角矩阵,其中我确实在对角线上有值?我会提前知道方阵的大小。在这种情况下,它将是 14x14,但是,我正在努力达到一个点,通过知道我的数字向量中的元素数量,我可以找出方阵的宽度或长度。
  • 维基百科下三角矩阵的定义与你原来的用法一致,@PauliusSatkus。 “如果主对角线以上的所有项都为零,则方阵称为下三角矩阵。”
  • 亚当,是的,图片是准确的,在第 6 列和第 7 列之间以及第 12 列和第 13 列之间发生了“奇怪”的事情。这种格式正是我努力寻找解决方案的原因。否则,以下解决方案将起作用。

标签: r matrix


【解决方案1】:

编辑:自动化方式

这是一个可以处理您所要求的功能...

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

【讨论】:

  • 这行得通。但是,我想知道是否有函数或方法可以做到这一点的部分原因是因为我计划拥有不同长度的向量。因此,虽然此解决方案适用于 14x14 矩阵,但对于 13x13 或 12x12 矩阵等而言,则需要不同的尺寸。
  • 是的,我想通了。但是你必须说明模式。你怎么知道你什么时候开始你的新模式?是70吗?是在一定数量的列之后吗?关于模式何时以及为何移动,需要说明一些基本规则。没有它,我认为你不会得到更强大的东西。
  • 我能想到的唯一真正的规则是,每 6 列之后就会出现“怪异”。使用 13x13 矩阵而不是 70 它将是 64,使用 12x12 它将是 58,依此类推,所以它减少了 6。对于 14x14 矩阵,显然有 14 列,因此在第 6 列之后,分列会发生两次,在第 12 列之后。对于 19x19 矩阵,我们将出现 3 次分栏 - 在第 6、第 12 和第 18 之后。我提出这个问题是因为不寻常的值会在每个分栏后开始
  • 该信息应该在原始问题中。我认为我刚刚添加的功能应该可以做到。
  • 谢谢亚当,这太棒了!
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2013-02-02
相关资源
最近更新 更多