你可以把你的随机伽马放在一个上三角矩阵中并对列求和:
sz <- 1e3L
m <- matrix(0, nrow = sz, ncol = sz)
m[upper.tri(m, diag = TRUE)] <- rgamma((sz^2 + sz)/2, rep(1:sz, 1:sz))
s <- colSums(m)
要验证每列是否获得正确的形状参数:
sz <- 10L
m <- matrix(nrow = sz, ncol = sz)
m[upper.tri(m, diag = TRUE)] <- rep(1:sz, 1:sz)
> m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 3 4 5 6 7 8 9 10
[2,] NA 2 3 4 5 6 7 8 9 10
[3,] NA NA 3 4 5 6 7 8 9 10
[4,] NA NA NA 4 5 6 7 8 9 10
[5,] NA NA NA NA 5 6 7 8 9 10
[6,] NA NA NA NA NA 6 7 8 9 10
[7,] NA NA NA NA NA NA 7 8 9 10
[8,] NA NA NA NA NA NA NA 8 9 10
[9,] NA NA NA NA NA NA NA NA 9 10
[10,] NA NA NA NA NA NA NA NA NA 10
编辑:或稍快的单线:
s <- colSums(replace(matrix(0, sz, sz), sequence(1:sz, seq(1, sz^2 - sz + 1, sz)), rgamma((sz^2 + sz)/2, rep(1:sz, 1:sz))))
或者您可以直接对总和进行抽样:
s <- rgamma(sz, (1:sz)^2)