我想在R中定义一个包含参数verctors和矩阵的函数。是否有可能以矩阵形式定义这样的函数,以便不需要开发函数来编码它? 示例:我想编写下面的函数,保持矩阵形式
等式(1)
c(w)= c' * w +(1/2)* w' * D * w
其中
c是(3X1)参数向量,c =(c1 c2 c3)'
c = c("c1", "c2", "c3")
w是(3X1)数据向量,w =(w1 w2 w3)'
w = c("w1", "w2","w3")
D是具有
的(3X3)四元数参数矩阵 |dLL|dLK|dLM|
D = |dKL|dKK|dKM|
|dML|dMK|dMM|
D = matrix(c("dLL","dLK","dLM","dKL","dKK", "dKM", "dML", "dMK","dMM"), nrow=3, ncol = 3)
现在,我尝试做以下事情:
c_f1 <- function(c, w, D) {
D = matrix(c("dLL","dLK","dLM","dKL","dKK", "dKM", "dML", "dMK","dMM"), nrow=3, ncol = 3)
c = c("c1", "c2", "c3")
w = c("w1", "w2","w3")
t(c) %*% w + 0.5 * t(w) %*% D %*% w
}
目标是对w1采取偏导数,如下所示(显然不起作用)
library(Deriv)
Deriv(c_f1, "w1")
一个有效的例子但我试图避免: 当开发方程(1)(乘以向量和矩阵)时,我们得到下面的函数(这是一个组合的标量积)
c_f2 = function(w1,w2,w3, c1, c2,c3,dLL,dLK, dLM,dKL,dKK, dKM, dML,dMK,dMM){
c1 * w1 + c2 * w2 + c3 * w3 +
(1/2) * (dLL * (w1*w1) + dLK*(w1*w2) +
dLM * (w1*w3) + dKL * (w2*w1) + dKK*(w2*w2) +
dKM * (w2*w3) + dML * (w3*w1) + dMK*(w3*w2) + dMM * (w3*w3)) }
以下命令完美无缺:
Deriv(c_f2,"w1)
由于等式(1)可以采用如此处所示的更复杂的形式,我希望以矩阵形式编码等式(1),这样我们就不需要对已开发的函数进行编码(因为不易出错),但是,通过Deriv
允许关于其参数的偏导数。
答案 0 :(得分:1)
这对我有用
c <- 1:3
w <- 4:6
D <- matrix(1:9, nrow=3)
c' * w + (1/2) * w' * D * w
myfun <- function(c, w, D) {
t(c) %*% w + 0.5 * t(w) %*% D %*% w
}
# [,1]
# [1,] 654.5
使用您的功能
c_f(w[1],w[2],w[3],c[1],c[2],c[3],D[1,1],D[1,2],D[1,3],D[2,1],D[2,2],D[2,3],D[3,1],D[3,2],D[3,3])
# 654.5