有没有办法使用base::apply和CVXR elementwise函数将elementwise函数应用于矩阵的每一列?假设向量的长度与矩阵的行数相匹配,我希望我的目标函数能够如下所示:
new_matrix <- apply(constant_matrix, 2, function(x) x * variable_vector)
objective <- sum_entries( max_entries( as.matrix(new_matrix), axis = 2 ) )我在解决这个问题时遇到了以下错误:min(常量)错误:参数的'type‘(列表)无效
(如果我的代码不清楚,我的目标是将一个变量向量乘以一个常量矩阵的每一列,然后得到每个缩放列的最大值,然后对所有这些最大值求和。)
谢谢!
发布于 2020-04-12 00:37:57
下面我给出了一个使用base::apply和CVXR的逐个元素乘法的例子以及输出。有关更复杂的示例,请参阅Pliable Lasso。
library(CVXR)
library(magrittr)
constant_matrix <- base::matrix(1:20, nrow = 4)
variable_vector <- CVXR::Variable(4, pos = TRUE)
constant_matrix %>%
base::apply(MARGIN = 2, FUN = function(x) CVXR::multiply(lh_exp = x, rh_exp = variable_vector)) %>%
base::lapply(max) ->
column_max_list
objective <- base::Reduce(f = '+', x = column_max_list)
prob <- CVXR::Problem(CVXR::Minimize(objective), constraints = list(variable_vector >= 2))
result <- CVXR::solve(prob, verbose = TRUE)
result$value
result$getValue(variable_vector)下面是输出:
-----------------------------------------------------------------
OSQP v0.6.0 - Operator Splitting QP Solver
(c) Bartolomeo Stellato, Goran Banjac
University of Oxford - Stanford University 2019
-----------------------------------------------------------------
problem: variables n = 9, constraints m = 28
nnz(P) + nnz(A) = 48
settings: linear system solver = qdldl,
eps_abs = 1.0e-05, eps_rel = 1.0e-05,
eps_prim_inf = 1.0e-04, eps_dual_inf = 1.0e-04,
rho = 1.00e-01 (adaptive),
sigma = 1.00e-06, alpha = 1.60, max_iter = 10000
check_termination: on (interval 25),
scaling: on, scaled_termination: off
warm start: on, polish: on, time_limit: off
iter objective pri res dua res rho time
1 -1.0811e+02 1.94e+01 1.56e+01 1.00e-01 6.07e-05s
200 1.1999e+02 3.92e-04 4.69e-04 1.00e-01 2.31e-04s
300 1.2000e+02 1.46e-05 2.92e-06 1.00e-01 2.86e-04s
status: solved
solution polish: unsuccessful
number of iterations: 300
optimal objective: 120.0005
run time: 3.11e-04s
optimal rho estimate: 3.06e-01
> result$value
[1] 120.0005
> result$getValue(variable_vector)
[,1]
[1,] 2.248055
[2,] 2.149815
[3,] 2.057720
[4,] 2.000007
`https://stackoverflow.com/questions/61142357
复制相似问题