R在矩阵形式中定义函数

时间:2017-10-04 14:41:24

标签: r function matrix

我想在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允许关于其参数的偏导数。

1 个答案:

答案 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