【问题标题】:a vector to an upper Triangle matrix by row in RR中逐行指向上三角矩阵的向量
【发布时间】:2015-08-27 12:48:45
【问题描述】:

我有一个向量说

a = c(1,2,3,4,5,6) 

我想按行将它们组织成一个上三角矩阵(不考虑对角线元素,它们都为零)。我的目标是得到以下矩阵:

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

但我这样做的以下方法是用这个向量替换对角线元素,但按列分配值。例如,

b= matrix(0, 4, 4)
b[upper.tri(b, diag=FALSE)]=a 

它会给我以下矩阵

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

原因是当 R 为矩阵赋值时,默认情况下,它会按列赋值。我想知道是否有一种简单的方法可以在不编写 for 循环的情况下解决我的问题。

我之前发现了一篇与我的问题相关的类似帖子,但它没有解释按行将值分配给上三角矩阵:

creating a triangular matrix

提前致谢!

【问题讨论】:

    标签: r matrix vector


    【解决方案1】:

    这里有一个选项

    b[lower.tri(b, diag=FALSE)] <- a
    b <- t(b)
    b
    #      [,1] [,2] [,3] [,4]
    # [1,]    0    1    2    3
    # [2,]    0    0    4    5
    # [3,]    0    0    0    6
    # [4,]    0    0    0    0
    

    或者,根据需要对a 重新排序并将其分配到右上角的三角形中:

    ut <- upper.tri(b, diag=FALSE)
    b[ut] <- a[order(row(ut)[ut], col(ut)[ut])]
    b
         [,1] [,2] [,3] [,4]
    [1,]    0    1    2    3
    [2,]    0    0    4    5
    [3,]    0    0    0    6
    [4,]    0    0    0    0
    

    【讨论】:

      【解决方案2】:

      请注意,要填充 ASYMMETRIC 矩阵,您可以首先通过上面显示的代码填充上三角形,然后使用不同的向量填充下三角形(无需转置)。

        c <- c(7,8,9,10,11,12)
        b[lower.tri(b, diag=FALSE)] <- c
      

      【讨论】:

        猜你喜欢
        • 2016-05-18
        • 2017-12-19
        • 1970-01-01
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 2014-12-11
        • 2015-03-26
        相关资源
        最近更新 更多