2016-11-30 94 views
1

我试图填补下三角我的矩阵M的一个预充式向量,Vr逆转下三角矩阵环

我原来的矩阵看起来与此类似:

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功能它给出了一个错误,所以我建立了一个循环只应该从BUTTOM起来的栏:

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] 

最好的方法是什么?

回答

2

要填充的矩阵部分是原始矩阵的下三角矩阵相对于行方向的反射,因此您可以将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 
1

我们可以这样来做:

定义与待插入

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

的v值全矩阵现在,我们可以以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 
对应的值反向更大替换元素