【问题标题】:R reverse lower triangle matrix loopR反向下三角矩阵循环
【发布时间】:2016-11-30 22:00:12
【问题描述】:

我正在尝试用预填充向量 V 填充矩阵 M 的下对角线

我的原始矩阵看起来像这样:

M = matrix(c(.3,.2,.1,0), nrow=4, ncol=5)

M  1  2  3  4 5
1 .3 .3 .3 .3 .3
2 .2 .2 .2 .2 .3
3 .1 .1 .1 .1 .1
4 0  0  0  0   0

我有一个类似这样的向量:

 V
 .4
 .3
 .25
 .1

现在我想用这个向量填充下三角形,得到:

0  1  2  3  4  5
1 .3 .3 .3 .3 .1
2 .2 .2 .2 .25 .25
3 .1 .1 .3 .3 .3 
4 0  .4 .4 .4 .4

如果我使用 lower.tri 函数,它会给出一个错误,所以我构建了一个循环,它只应该从底部填充列:

o <- 5
c <- 2
s <- 1
for(s in (1:o)){  
 for(c in (2:o)){
   M[((o-s):o),c] <- V[1:c]}}

我的想法是像我手动写的那样向上移动:

M[(5-1):5,2] <- V[1:2]
M[(5-2):5,3] <- V[1:3] 

最好的方法是什么?

【问题讨论】:

    标签: r matrix triangular


    【解决方案1】:

    您要填充的矩阵部分是原始矩阵的下三角矩阵相对于行方向的反映,因此您可以将rev 函数应用于lower.tri() 结果以将每一行反转为获取替换元素的索引,然后就很简单了:

    假设您有矩阵M 和向量v

    M
    #   X1  X2  X3  X4  X5
    #1 0.3 0.3 0.3 0.3 0.3
    #2 0.2 0.2 0.2 0.2 0.3
    #3 0.1 0.1 0.1 0.1 0.1
    #4 0.0 0.0 0.0 0.0 0.0
    
    v
    # [1] 0.40 0.30 0.25 0.10
    
    lowerIndex = t(apply(lower.tri(M, diag = TRUE), 1, rev))
    M[lowIndex] <- (lowIndex * rev(v))[lowIndex]
    M
    
    #   X1  X2  X3   X4   X5
    #1 0.3 0.3 0.3 0.30 0.10
    #2 0.2 0.2 0.2 0.25 0.25
    #3 0.1 0.1 0.3 0.30 0.30
    #4 0.0 0.4 0.4 0.40 0.40
    

    【讨论】:

      【解决方案2】:

      我们可以这样做:

      用要插入的 v 的值定义一个完整的矩阵

      N = matrix(rev(v), 4, 5)
      

      现在我们可以用替换矩阵中的对应值替换M中列大于行倒数的元素

      R = rev(row(M))
      C = col(M)
      M[C>R] = N[C>R]
      
           # [,1] [,2] [,3] [,4] [,5]
      # [1,]  0.3  0.3  0.3 0.30 0.10
      # [2,]  0.2  0.2  0.2 0.25 0.25
      # [3,]  0.1  0.1  0.3 0.30 0.30
      # [4,]  0.0  0.4  0.4 0.40 0.40
      

      【讨论】:

        猜你喜欢
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 2012-09-04
        相关资源
        最近更新 更多