2016-11-30 125 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 
對應的值反向更大替換元素