我遇到了一个特殊的问题:我要做的是基于矩阵中的其他值来获取矩阵中的值,例如
[,1] [,2] [,3]
[1,] 110 0.0000 0.0000
[2,] 0 300.3475 0.0000
[3,] 0 0.0000 820.0785
现在,我希望第一列的值一直到最后一行的值:
[1,1] = 110
[2,1] = [1,1] * const
[3,1] = [2,1] * const
在第二列:
[2,1] = 0
[2,2] = 300.3475
[3,2] = [2,2] * const
每列都相同。因此,关键是要从[i,i]获得值,将其乘以const并放入[i + 1,i],然后将该值乘以const并放入[i + 2,i]。每个列的步骤相同。因此,上面显示的矩阵将像这样(const = 0.36624):
[,1] [,2] [,3]
[1,] 110.00000 0.0000 0.0000
[2,] 40.28666 300.3475 0.0000
[3,] 14.75468 110.0000 820.0785
我想出了类似这样的东西:
N <- 2
M.dim <- N+1
d <- 0.36624 #const
S0 <- c(110, 320, 820.075) #but length of this vector equals M.dim it's just example)
bin.mat <- matrix(rep(0), M.dim, M.dim)
for(i in 1:M.dim){
for(j in i:N){
bin.mat[i,i] <- S0[i]
bin.mat[j + 1, i] <- bin.mat[j, i] * d
}
}
现在,它正在工作-但显示错误:
Error in `[<-`(`*tmp*`, j + 1, i, value = bin.mat[j, i] * d) :
subscript out of bounds
说实话,我不知道为什么。可能是因为我不太了解这个循环的工作原理,所以我只是尝试了它的maaaaaany变体,而这是我实际想要做的唯一一个:D并且尽管其他基于此矩阵的计算均不正确,但我怀疑只要因为它适用于少量的列或行,所以可能不适用于较大的列或行。
答案 0 :(得分:1)
使用apply
和cumprod
的另一种方法
const <- 0.36624
mat[lower.tri(mat)] <- const
mat[upper.tri(mat)] <- 1
out <- apply(mat, 2, cumprod)
out[upper.tri(out)] <- 0
out
# [,1] [,2] [,3]
#[1,] 110.00000 0.0000 0.0000
#[2,] 40.28640 300.3475 0.0000
#[3,] 14.75449 109.9993 820.0785
这个想法是用0
代替下部三角形中的const
,用1
替代上部三角形中的值,然后在每列上应用cumprod
。
数据
mat <- structure(c(110, 0, 0, 0, 300.3475, 0, 0, 0, 820.0785), .Dim = c(3L,
3L), .Dimnames = list(NULL, NULL))
答案 1 :(得分:0)
本质上,问题在于3:2
是向量c(3,2)
。因此,当i = 3
尝试bin.mat[j+1,i]
时,您会越界。这是一个修复程序(保持循环)
for(i in 1:M.dim){
bin.mat[i,i] <- S0[i]
if (i >= 3) next # or i > N works as well
for(j in i:N){
bin.mat[j + 1, i] <- bin.mat[j, i] * d
}
}
bin.mat
# returns
[,1] [,2] [,3]
[1,] 110.00000 0.0000 0.000
[2,] 40.28640 320.0000 0.000
[3,] 14.75449 117.1968 820.075