2016-11-30 2 views
1

Я пытаюсь заполнить нижнюю диагональ моей матрицы М с укажи вектором 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 он выдает ошибку, так что я построил цикл, который только должен заполнить столбцы из днище вверх:

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

Мы можем сделать это следующим образом:

Определить полную матрицу со значениями V, чтобы быть вставленными

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

Теперь мы можем заменить элементы в М, столбец больше обратной строки с соответствующим значением в матрице замещения

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 
Смежные вопросы