我需要从下面的值创建一个随机矩阵,其中包含两个基本规则:
1)每列必须只包含一个值,其余值为零和
2)每行必须只占一个值。
# create dummy matrix
B = matrix(
c(83, 101, 75, 182, 150, 199,
218, 80, 90, 138, 249, 299,
113, 171, 146, 226, 40.4, 78,
314, 116, 186, 33.2, 345, 196,
327, 189, 199, 109, 359, 281,
430, 292, 302, 232, 461, 404
), ncol=6, nrow=6)
# Transpose
t(B)
# names for cols and rows
colnames(B) <- c("x1", "x2", "x3", "x4", "x5", "x6")
rownames(B) <- c("y1", "y2", "y3", "y4", "y5", "y6")
该安排的每种可能组合都是输出
x1 x2 x3 x4 x5 x6
y1 83 0 0 0 0 0
y2 0 0 90 0 0 0
y3 0 171 0 0 0 0
y4 0 0 0 0 345 0
y5 0 0 0 109 0 0
y6 0 0 0 0 0 404
,例如
x1 x2 x3 x4 x5 x6
y1 0 101 0 0 0 0
y2 218 0 0 0 0 0
y3 0 0 146 0 0 0
y4 0 0 0 0 345 0
y5 0 0 0 109 0 0
y6 0 0 0 0 0 404
依此类推......
拜托,有没有优雅的解决方案,如何做到这一点。任何建议或帮助非常感谢。非常感谢前进。
答案 0 :(得分:1)
创建对角矩阵,然后置换行或列。在单个随机排列的情况下sample(n)
就足够了,allPerms
。
n <- 3 # dimension
mat <- diag(1:n)
permute::allPerms(n) -> perms
mat[perms[k, ], ] # k-th permutation
缺点是所有排列都会生成并保存。