我想要一个到处都是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
请注意,diag +/- 2填充为0.2。在第一个矩阵中,diag +1填充为0.5。这意味着最后,这些概率可能会“重叠”并进入左下角。
答案 0 :(得分:4)
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
然后,您可以使用以下命令添加最后的“无处不在” 0.5:
transProbs[10, 1] = 0.5
答案 1 :(得分:1)
利用矩阵是具有dim
属性的向量这一事实的另一种解决方案。
n <- 10
m <- 10
transProbs = matrix(0.0, nrow = n, ncol = m)
diag(transProbs) <- 0.5
transProbs[(1:(m - 1)) * (n + 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
由reprex package(v0.3.0)于2019-09-21创建
序列(1:(m - 1)) * (n + 1)
从对角线中选择所有矩阵元素。
修改
您可以实现在编辑时询问您的要求,即将相同序列的其余模数(加上移位)与总和中元素的总数即
n <- 10
m <- 10
transProbs = matrix(0.0, nrow = n, ncol = m)
diag(transProbs) <- 0.2
transProbs[((1:m) * (n + 1)) %% (n * m)] <- 0.2
transProbs[((1:m) * (n + 1) + m) %% (n * m)] <- 0.2
transProbs[((1:m) * (n + 1) + 7 * m) %% (n * m)] <- 0.2
transProbs[((1:m) * (n + 1) + 8 * m) %% (n * m)] <- 0.2
transProbs
#> [,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
由reprex package(v0.3.0)于2019-09-21创建
通过查看序列开始的列并减去2,可以确定shift的值(即+m
,+7m
和+8m
)。例如,生成如下序列从第三列开始,您必须对(3 - 2)*m
进行求和。
我希望清楚。
答案 2 :(得分:0)
我不喜欢这种解决方案,但是可以完成工作:
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
答案 3 :(得分:0)
首先创建一个将向量左右移动的函数(请注意-几乎可以肯定有一个库或函数已经在执行此操作,但是我找不到它!)
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
如果我们设置rowShift=2
和colShift=2
,则对于prob = 0.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
答案 4 :(得分:0)
我将使用矩阵索引(允许您根据“坐标”替换行);如果您查看diag<-
(print(`diag<-`)
)的源代码,就会发现它仅适用于仅对角线的情况。
NN = nrow(transProbs)
idx = seq_len(NN)
transProbs[cbind(idx, idx)] = .5 # replace diagonal
transProbs[cbind(idx[-NN], idx[-NN] + 1L)] = .5 # replace off-diagonal
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[cbind(c(idx, idx[-NN]), c(idx, idx[-NN] + 1L))] = .5
这可能稍微更有效,但是我认为,因为只有第一个[<-
呼叫副本transProbs
(请参阅?tracemem
和.Internal(inspect(transProbs))
)他的差异应该很小。