看板 R_Language 關於我們 聯絡資訊
# 因為你的例子不會看到變化結果,所以我把方程式改一下。 # 為了未來潛在使用的靈活性,把 z 和 y 也寫成參數 loc 了。 ff <- function(loc, a) { rez <- (loc[1] ^ 2) * (loc[2] ^ a) + 3 return(rez) } # try ff() ff(c(1, 2), a = 1) ff(c(1, 2), a = 3) # try grad() and hessian() library(numDeriv) grad(ff, c(1, 2), a = 1) grad(ff, c(1, 2), a = 3) hessian(ff, c(1, 2), a = 1) hessian(ff, c(1, 2), a = 3) # 這裡 grad() 和 hessian() 的用法受益於作者提供的 "..." 參數, # 所以本來給 ff() 的 a 可以直接丟入。 # 建立 a.seq 的 list,當成變動 a 的值與容器 a.seq <- as.list(seq(1, 3, 1)) # 利用 lapply 做 grad() 和 hessian() res.list <- lapply(a.seq, function(this.a) { res.grad <- grad(ff, c(1, 2), a = this.a) res.hessian <- hessian(ff, c(1, 2), a = this.a) return(list( res.grad = res.grad, res.hessian = res.hessian, a = this.a )) }) res.list # 結果與上面試驗相符 # 取出所有的 res.grad 或 res.hessian # 用 lapply 或 sapply 看之後的使用情況而定 lapply(res.list, function(x) x$res.grad) sapply(res.list, function(x) x$res.grad) lapply(res.list, function(x) x$res.hessian) sapply(res.list, function(x) x$res.hessian) 使用 list + l/sapply 系列的設計可能對之後的擴展更有利,例如平行運算。 for loop 當然也可以解,看個人撰寫偏好。 ※ 引述《TZULIU (消費券收購商)》之銘言: : [問題類型]: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : [軟體熟悉度]: : 使用者(已經有用R 做過不少作品) : [問題敘述]: : 想取(z^2)*(y^2)+a於z=1和y=2(在不同的a值下)的gradient與Hessian, : 在下面範例中,請問有沒有方法可以透過loop持續改變常數項3(e.g. 0到3)? : [程式範例]: : dummy <- function(x) { : z <- x[1]; y <- x[2] : rez <- (z^2)*(y^3)+3 : rez : } : grad(dummy, c(1,2)) : hessian(dummy, c(1,2)) : 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.37.172 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1478205712.A.F54.html ※ 編輯: andrew43 (122.117.37.172), 11/04/2016 04:42:19 ※ 編輯: andrew43 (122.117.37.172), 11/04/2016 04:48:05
TZULIU: 感謝你的幫忙! 11/08 11:38