【问题标题】:r creation diagonal matrix from vector with use upper.tri functionr使用upper.tri函数从向量创建对角矩阵
【发布时间】:2019-08-25 07:50:52
【问题描述】:

我有矢量

vector= c(4,6,2,9)

我需要得到像这样的对角矩阵(第二列应该包含在一个元素上向下滚动的向量,第三列 - 在两个元素上等):

4 0 0 0
6 4 0 0
2 6 4 0
9 2 6 4

我不明白我应该使用upper.tri。

我试过这个:

vector = c(4,6,2,9)
vector_length=length(a)
MATRIX= matrix(0, vector_length, vector_length)
MATRIX[!upper.tri(MATRIX)]=vector 
MATRIX

失败了,因为结果是

       [,1] [,2] [,3] [,4]
[1,]    4    0    0    0
[2,]    6    4    0    0
[3,]    2    6    9    0
[4,]    9    2    4    6

我应该如何正确使用这个功能?我应该如何解决我的问题?

【问题讨论】:

    标签: r matrix vector


    【解决方案1】:

    这是一种方法:

    MATRIX = matrix(c(vector, 0), vector_length, vector_length)
    # ignore warning about uneven recycling
    MATRIX[upper.tri(MATRIX)] = 0
    #      [,1] [,2] [,3] [,4]
    # [1,]    4    0    0    0
    # [2,]    6    4    0    0
    # [3,]    2    6    4    0
    # [4,]    9    2    6    4
    

    【讨论】:

      【解决方案2】:

      一种选择是使用 data.table::shiftn 参数中矢量化这一事实

      do.call(cbind, data.table::shift(vector, seq(vector_length) - 1, fill = 0))
      #      [,1] [,2] [,3] [,4]
      # [1,]    4    0    0    0
      # [2,]    6    4    0    0
      # [3,]    2    6    4    0
      # [4,]    9    2    6    4
      

      或者在基础 R 中使用 row()col()

      m <- matrix(0, vector_length, vector_length)
      diagn <- row(m) - col(m) + 1
      m[diagn > 0] <- vector[diagn[diagn > 0]]
      
      m
      #      [,1] [,2] [,3] [,4]
      # [1,]    4    0    0    0
      # [2,]    6    4    0    0
      # [3,]    2    6    4    0
      # [4,]    9    2    6    4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        相关资源
        最近更新 更多