例如,我可以轻松指定任意矩阵,如
x <- matrix(c(10,0.25,0.25,0.25,0.25,0.25,
10,0.25,0.25,0.25,0.25,0.25,
10,0.25,0.25,0.25,0.25,0.25,
10,0.25,0.25,0.25,0.25,0.25),
nrow = 4, ncol = 6, byrow = TRUE)
但是在优化问题中,我需要在约束x
下使用矩阵max(colSums(x)) <= 1
。我怎样才能生成这样的矩阵?
答案 0 :(得分:1)
好的,我会把我的评论写进一个答案。
x <- matrix(c(10,0.25,0.25,0.25,0.25,0.25,
10,0.25,0.25,0.25,0.25,0.25,
10,0.25,0.25,0.25,0.25,0.25,
10,0.25,0.25,0.25,0.25,0.25),
nrow = 4, ncol = 6, byrow = TRUE)
alpha <- colSums(x) + runif(ncol(x), 0, abs(mean(x)))
y <- t(t(x) / alpha)
> x
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 10 0.25 0.25 0.25 0.25 0.25
[2,] 10 0.25 0.25 0.25 0.25 0.25
[3,] 10 0.25 0.25 0.25 0.25 0.25
[4,] 10 0.25 0.25 0.25 0.25 0.25
> y
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0.2397915 0.1814021 0.09312788 0.09021147 0.1116572 0.1147005
[2,] 0.2397915 0.1814021 0.09312788 0.09021147 0.1116572 0.1147005
[3,] 0.2397915 0.1814021 0.09312788 0.09021147 0.1116572 0.1147005
[4,] 0.2397915 0.1814021 0.09312788 0.09021147 0.1116572 0.1147005
> alpha ## random scaling factor
[1] 41.702890 1.378154 2.684481 2.771266 2.238996 2.179589
> colSums(y)
[1] 0.9591661 0.7256085 0.3725115 0.3608459 0.4466288 0.4588021
我没有设定种子。所以当你跑步时,结果会有所不同。
<强>后续强>
非常感谢。只需补充一条评论。使用这种方法,我可以控制特定的列总和为&lt; = 1,即,如果我不想要第一列的约束而是其他人的约束,那该怎么办呢?
您可以手动将alpha[1]
设置为1,这样就不会进行缩放。
alpha <- colSums(x) + runif(0, abs(mean(x)), ncol(x))
alpha[1] <- 1
然后继续。如果您希望第3列也不受影响,请执行
alpha[c(1,3)] <- 1
随机种子
比较
runif(4)
## [1] 0.1300864 0.5689224 0.5594464 0.8778068
runif(4)
## [1] 0.3320244 0.5838847 0.0466045 0.2594867
但如果我们设定种子:
set.seed(0); runif(4)
## [1] 0.8966972 0.2655087 0.3721239 0.5728534
set.seed(0); runif(4)
## [1] 0.8966972 0.2655087 0.3721239 0.5728534
不使用种子,随机数不可重现。我没有在set.seed(0)
之前添加alpha
,因此当您运行代码时,您会看到不同的alpha
,y
。
种子可以是任何整数,不一定是0.例如,-2016和2016都有效。但是对于不同的种子,你会得到不同的随机数。但是,无论何时使用相同的种子,随机数都是相同的。