我正在优化一个函数,该函数将大小约为 300 的向量作为输入。该目标函数调用其他几个函数,每个函数都使用输入向量的子集。该设置的示例如下:
mainprog <- function(theta){
alpha <- theta[1:20]
beta <- theta[21:35]
...
fun1(alpha)
fun2(beta)
...
return(X)
}
出于优雅、维护和理智的原因,我不想像上面的示例那样对
alpha
和 beta
进行硬编码。定义这些子向量 alpha
和 beta
的好方法是什么?
我唯一的限制是我希望能够使用优化器来优化
theta
而不会遇到太多麻烦。有人对如何去做有任何建议吗?
您可以编写一个默认为整个向量
theta
的函数,并提供 alpha
和 beta
参数来对其进行子集化,如果未指定 beta
,则默认为 alpha
。
> mainprog <- function(theta, alpha=seq_along(theta), beta=alpha) {
+ s1 <- sqrt(theta[alpha])
+ s2 <- sqrt(theta[beta])
+ return(list(s1, s2))
+ }
>
> mainprog(1:10)
[[1]]
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 3.000000 3.162278
[[2]]
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 3.000000 3.162278
> mainprog(1:10, 1:3)
[[1]]
[1] 1.000000 1.414214 1.732051
[[2]]
[1] 1.000000 1.414214 1.732051
> mainprog(1:10, 1:3, 7:10)
[[1]]
[1] 1.000000 1.414214 1.732051
[[2]]
[1] 2.645751 2.828427 3.000000 3.162278
错误的规格很容易产生
NA
。
> mainprog(1:10, 1:3, 7:13)
[[1]]
[1] 1.000000 1.414214 1.732051
[[2]]
[1] 2.645751 2.828427 3.000000 3.162278 NA NA NA