调用optim函数时矩阵乘法出现“non-conformable”错误的解决方法
解决optim函数调用时的"non-conformable arguments"错误
问题原因
optim函数会自动将par参数扁平化为向量传入目标函数,而非保留原有的矩阵结构。你的代码中初始W是2×2矩阵,但optim调用时会把它转成长度为4的向量,此时在函数里执行W %*% x就会因维度不兼容报错。
解决方案
在目标函数内部,先将传入的向量形式的W重新转换为原矩阵的维度(2行2列),再执行后续计算。修改后的代码如下:
f <- function(W_vec, x, y){ # 将向量转换回2×2矩阵 W <- matrix(W_vec, nrow = 2, ncol = 2) temp <- W %*% x temp1 <- t(temp) %*% temp temp2 <- t(temp) %*% y temp3 <- t(y) %*% y (temp1 - 2 * temp2 + temp3)[1] } x <- matrix(c(1,2), ncol=1) y <- matrix(c(5,3), ncol=1) W_init <- matrix(c(1,2,3,4), ncol=2) # 调用optim时传入扁平化的初始参数,或直接传矩阵(optim会自动转成向量) optim(par = W_init, fn = f, x = x, y = y)
补充说明
- 函数参数名从
W改为W_vec仅为表述清晰,也可保留原名,只要内部完成矩阵转换即可。 - 若需要指定优化方法(比如无约束优化常用的
L-BFGS-B或Nelder-Mead),可添加method参数,示例:optim(par = W_init, fn = f, x = x, y = y, method = "L-BFGS-B") - 修改后单独测试函数也能正常运行:
f(as.vector(W_init), x = x, y = y) # 输出:53,和之前的结果一致
内容的提问来源于stack exchange,提问作者user2550228
相关产品推荐
相关产品推荐

