在R

时间:2016-06-20 14:05:08

标签: r matrix

例如,我可以轻松指定任意矩阵,如

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。我怎样才能生成这样的矩阵?

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,因此当您运行代码时,您会看到不同的alphay

种子可以是任何整数,不一定是0.例如,-2016和2016都有效。但是对于不同的种子,你会得到不同的随机数。但是,无论何时使用相同的种子,随机数都是相同的。