我想在MATLAB(使用统计工具箱)中包含一些从现有概率分布中创建新概率分布的简单方法.例如:有限混合物或化合物分布.我的目标是实现与现有概率分布及其周围环境的无缝集成.是否有一些文档或示例应该如何做?
该文档仅包含预定义分发的描述.我找不到"概率分布对象"的类结构或如何编写自定义"makedist"函数.
我想从暗淡 (K,N) 的两个矩阵 A 和暗淡 (d,N) 的 X 确定一个维度为 (K,d,d) 的 3 数组 R,其中 K 很小,d 适中,但 N 是大(有关典型值,请参阅下面的代码示例)。数组的公式是
R[k, i, j] = sum( A[k, ] * X[i, ] * X[j, ] )。
该数组必须计算多次,因此速度至关重要。因此,我想知道在 R 中计算这个最有效的方法是什么?
我当前的方法在下面被列为“当前”和“天真的”方法,毫不奇怪,它的速度要慢得多。
library(microbenchmark)
K = 3
d = 20
N = 1e5
tt = microbenchmark(
current = {
for(krow in 1:K){
tmp = X * matrix(A[krow,], d, N, byrow = TRUE)
R[krow,,] = tmp %*% t(X)
}},
naive = {
for(krow in 1:K){
for(irow …Run Code Online (Sandbox Code Playgroud) 我有一个包含内部循环的外部 foreach/dopar 并行循环。内部循环的每个实例都应该处理同一组随机数。其余部分,即外部主体的其余部分和并行实例应照常工作,即具有独立的随机数。
我可以在非并行实现中实现这一点,方法是在内循环开始之前保存 RNG 的状态,并在执行内循环的每个实例之后恢复该状态。请参见以下示例:
library(doSNOW)
seed = 4711
cl = makeCluster(2)
registerDoSNOW(cl)
clusterSetupRNGstream (cl, seed=rep(seed,6))
erg = foreach(irun = 1:3,.combine = rbind) %dopar% {
#do some random stuff in outer loop
smp = runif(1)
# save current state of RNG
s = .Random.seed
# inner loop, does some more random stuff
idx = numeric(5)
for(ii in seq.int(5)) {
idx[ii] = sample.int(10, 1)
# reset RNG for next loop iteration
set.seed(s)
}
c(smp,idx)
}
> print(erg)
[,1] [,2] [,3] …Run Code Online (Sandbox Code Playgroud) r ×2
distribution ×1
matlab ×1
montecarlo ×1
oop ×1
performance ×1
random ×1
rcpp ×1
snow ×1
statistics ×1
tensor ×1