给出一个矩阵的例子:
<表类>
指数
1
2
3
4
5
6
7
8
9
10
tbody><<tr>1 0.1 0.1 0.1 0.2 0.2 0.2 0.7 0.7 0.4 0.7 20.6 0.6 0.6 0.1 0.1 0.1 0.1 0.1 0.5 0.1 3 0.3 0.3 0.3 0.7 0.7 0.7 0.2 0.2 0.1 0.2 表类>
为了使每个排列,我让您的数据为dummy
,使用expand.grid
grid <- expand.grid(rep(list(1:3), 10))
由于grid
非常大,我将使用grid
的前五个
grid <- grid[c(1:5),]
让我们定义一个函数来提取dummy
的网格行号(?)值。
func <- function(df, idx) {
vec <- c()
for (i in 1:length(idx)){
vec[i] <- df[as.numeric(idx[i]),i]
}
vec
}
最后,得到这些值的乘法,如
apply(grid, 1, function(x) prod(func(dummy, x)))
1 2 3 4 5
1.09760e-06 6.58560e-06 3.29280e-06 6.58560e-06 3.95136e-05
如果你想知道最大值是多少
grid[which.max(apply(grid, 1, function(x) prod(func(dummy, x)))),]
Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10
5 2 2 1 1 1 1 1 1 1 1
这是第二条路
然而我认为这种方法能更有效地得到最大值和它的索引。因为所有的元素都是正的,
x <- apply(dummy, 2, function(x) which.max(x))
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
2 2 2 3 3 3 1 1 2 1
prod(func(dummy,x))
[1] 0.01270609
第二种方式的大尺寸示例
microbenchmark::microbenchmark(test ={x <- runif(250000,0,1)
y <- matrix(x, nrow = 5)
xx <- apply(y, 2, function(x) which.max(x))
prod(func(y,xx))}
)
Unit: milliseconds
expr min lq mean median uq max neval
test 86.0542 91.41575 111.9721 96.9571 140.7912 171.8394 100