我想要一个到处都是0的矩阵,对角线和对角线+1有0.5值。
我用以下代码创建矩阵:
n = 10
transProbs = matrix(0, nrow = n, ncol = n)
然后,在对角线中填充:
diag(transProbs) = 0.5
矩阵现在看起来如下:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[2,] 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[3,] 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[4,] 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0
[5,] 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0
[6,] 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0
[7,] 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0
[8,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0
[9,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0
[10,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5
然而,我希望它是:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[2,] 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[3,] 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0
[4,] 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0
[5,] 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0
[6,] 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0
[7,] 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0
[8,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0
[9,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5
[10,] 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5
编辑:
该矩阵将用于library(HMM)
,initHMM
作为transProbs
矩阵。
我希望emissionProbs
的输出是:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2
[2,] 0.2 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2
[3,] 0.2 0.2 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0
[4,] 0.0 0.2 0.2 0.2 0.2 0.2 0.0 0.0 0.0 0.0
[5,] 0.0 0.0 0.2 0.2 0.2 0.2 0.2 0.0 0.0 0.0
[6,] 0.0 0.0 0.0 0.2 0.2 0.2 0.2 0.2 0.0 0.0
[7,] 0.0 0.0 0.0 0.0 0.2 0.2 0.2 0.2 0.2 0.0
[8,] 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.2 0.2 0.2
[9,] 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.2 0.2
[10,] 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.2
请注意,充满0.2的是diag +/-2。在第一个矩阵中,用0.5填充的是diag +1。这意味着,在最后,概率可能“重叠”,并在左下角。
发布于 2019-09-21 08:54:12
diag(transProbs[,-1]) = 0.5
会做的
在我的终端中,输出是:
transProbs
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[2,] 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[3,] 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0
[4,] 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0
[5,] 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0
[6,] 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0
[7,] 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0
[8,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0
[9,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5
[10,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5
之后,您可以使用:transProbs[10, 1] = 0.5
添加最后一个"out out“0.5
发布于 2019-09-21 09:43:10
我不喜欢这个解决方案,但它的作用是:
element_on_diagonal <- 0.5
element_above_and_below_diaginal <- 0.2
a <- diag(x = element_on_diagonal,
nrow = 10)
for(i in seq_len(length.out = ncol(x = a)))
{
temp <- sapply(X = setdiff(x = seq(from = (i - 2),
to = (i + 2)),
y = i),
FUN = function(j) if (j %in% 1:10) j else if (j != 0) j %% 10 else 10)
a[temp, i] <- element_above_and_below_diaginal
}
a
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 0.5 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2
#> [2,] 0.2 0.5 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2
#> [3,] 0.2 0.2 0.5 0.2 0.2 0.0 0.0 0.0 0.0 0.0
#> [4,] 0.0 0.2 0.2 0.5 0.2 0.2 0.0 0.0 0.0 0.0
#> [5,] 0.0 0.0 0.2 0.2 0.5 0.2 0.2 0.0 0.0 0.0
#> [6,] 0.0 0.0 0.0 0.2 0.2 0.5 0.2 0.2 0.0 0.0
#> [7,] 0.0 0.0 0.0 0.0 0.2 0.2 0.5 0.2 0.2 0.0
#> [8,] 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.5 0.2 0.2
#> [9,] 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.5 0.2
#> [10,] 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.5
发布于 2019-09-21 09:54:41
首先,创建一个向左和向右移动向量的函数(注意,几乎可以肯定有一个库或函数已经这样做了,但我找不到它!)
shiftSeq <- function(n, shift){
#return vector 1:n, but start shifted
# e.g. shiftSeq(5,shift=1) returns c(2,3,4,5,1)
# e.g. shiftSeq(5,shift=-1) returns c(5,1,2,3,4)
if(shift>=1){
res <- c((shift+1):n, 1:(shift))
} else if(shift==0){
res <- 1:n
} else{
res <- c((n+1+shift):n, 1:(n+shift))
}
return(res)
}
> shiftSeq(5,shift=1)
[1] 2 3 4 5 1
我们将在另一个函数中使用这个shiftSeq
函数(如下所示)。其思想是使用apply
和shiftSeq
将“构建块”对角线矩阵中的每个列向上和向下移动,我们做了几次,每次在结果矩阵中积累这个移位矩阵。
关键是正确设置rowShift
和colShift
参数..。
createTranProb <- function(n, prob, rowShift, colShift){
# create transition probability matrix of size nxn
# - prob is non-zero prob
# - rowShift is number of rows to move prob down
# - colShift is number of cols to move prob to right
shifts = setdiff(c(-rowShift:colShift), 0)
matDiag <- diag(n)*prob
matRes <- matDiag
for(i in shifts){
matRes <- matRes +
apply(matDiag, 2,
function(x) x[shiftSeq(n,i)])
}
return(matRes)
}
它适用于prob=0.5案例:
> createTranProb(10, 0.5, rowShift=0, colShift=1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[2,] 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[3,] 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0
[4,] 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0
[5,] 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0
[6,] 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0
[7,] 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0
[8,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0
[9,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5
[10,] 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5
与prob=0.2一样,如果我们设置rowShift=2
和colShift=2
> createTranProb(10, 0.2, 2, 2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2
[2,] 0.2 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2
[3,] 0.2 0.2 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0
[4,] 0.0 0.2 0.2 0.2 0.2 0.2 0.0 0.0 0.0 0.0
[5,] 0.0 0.0 0.2 0.2 0.2 0.2 0.2 0.0 0.0 0.0
[6,] 0.0 0.0 0.0 0.2 0.2 0.2 0.2 0.2 0.0 0.0
[7,] 0.0 0.0 0.0 0.0 0.2 0.2 0.2 0.2 0.2 0.0
[8,] 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.2 0.2 0.2
[9,] 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.2 0.2
[10,] 0.2 0.2 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.2
为了好玩,我在prob=0.33333中添加了一个:
> createTranProb(10, 0.33333, 1, 1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.33333 0.33333 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.33333
[2,] 0.33333 0.33333 0.33333 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[3,] 0.00000 0.33333 0.33333 0.33333 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[4,] 0.00000 0.00000 0.33333 0.33333 0.33333 0.00000 0.00000 0.00000 0.00000 0.00000
[5,] 0.00000 0.00000 0.00000 0.33333 0.33333 0.33333 0.00000 0.00000 0.00000 0.00000
[6,] 0.00000 0.00000 0.00000 0.00000 0.33333 0.33333 0.33333 0.00000 0.00000 0.00000
[7,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.33333 0.33333 0.33333 0.00000 0.00000
[8,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.33333 0.33333 0.33333 0.00000
[9,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.33333 0.33333 0.33333
[10,] 0.33333 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.33333 0.33333
https://stackoverflow.com/questions/58038573
复制相似问题