R反向下三角矩阵循环
R reverse lower triangle matrix loop
我正在尝试用预填充向量 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]
最好的方法是什么?
要填充的矩阵部分是原始矩阵的下三角矩阵在行方向上的反映,因此您可以将 rev
函数应用于 lower.tri()
result 将每一行反转得到替换元素的索引,然后就很简单了:
假设您有矩阵 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
我们可以这样做:
定义一个包含要插入的 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
我正在尝试用预填充向量 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]
最好的方法是什么?
要填充的矩阵部分是原始矩阵的下三角矩阵在行方向上的反映,因此您可以将 rev
函数应用于 lower.tri()
result 将每一行反转得到替换元素的索引,然后就很简单了:
假设您有矩阵 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
我们可以这样做:
定义一个包含要插入的 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