R-外带矩阵
R- outer with matrix
假设我想最小化一个函数:
x<-seq(-4.5,4.5,by=.2)
y<-seq(-4.5,4.5,by=.2)
f <- function(x1,x2){(x1^2 + x2)^2 }
z <- outer(x,y,f)
其中 z 是 46 x 46 维矩阵:
> class(z)
[1] "matrix"
> dim(z)
[1] 46 46
所以我制作了一张结果图:
persp(x,y,z,phi=-45,theta=45,col="yellow",shade=.65 ,ticktype="detailed")
如果我写前面的,它可以工作,但是因为我想使用 optim 最小化函数,如果我使用它,我得到:
optim(c(-4,-4), f, df)$par
> Error in fn(par, ...) : argument "x2" is missing, with no default
所以我需要使用数组才能使用 optim。所以如果我写:
f <- function(x) (x[1]^2 + x[2])^2
x <- seq(-4.5,4.5,by=.2)
y <- seq(-4.5,4.5,by=.2)
s<-data.frame(cbind(x,y))
我可以使用优化:
optim(c(-4,-4), f, df)$par
但是outer报错:
z <- outer(s,f)
Error in as.vector(x, mode) : cannot coerce type 'closure' to
vector of type 'any'
不知道怎么解决
我相信这里的目标是不必用两种不同的方式编写函数,对吧?
f0 <- function(x1,x2) ( x1^2 + x2 )^2
f <- function(x) ( x[1]^2 + x[2] )^2
同样,也许您只想使用 s<-data.frame(cbind(x,y))
(没有 x
和 y
)。
以下是我会考虑做的事情:
outer(s[[1]],s[[2]],Vectorize(function(xi,yi) f(c(xi,yi))))
这样您只需编写一次函数,就可以使用 optim
(使用单个参数)。
注意:如果你想让网格x
和y
有不同的点数,你应该存储s <- list(x,y)
.该代码将以相同的方式工作。
假设我想最小化一个函数:
x<-seq(-4.5,4.5,by=.2)
y<-seq(-4.5,4.5,by=.2)
f <- function(x1,x2){(x1^2 + x2)^2 }
z <- outer(x,y,f)
其中 z 是 46 x 46 维矩阵:
> class(z)
[1] "matrix"
> dim(z)
[1] 46 46
所以我制作了一张结果图:
persp(x,y,z,phi=-45,theta=45,col="yellow",shade=.65 ,ticktype="detailed")
如果我写前面的,它可以工作,但是因为我想使用 optim 最小化函数,如果我使用它,我得到:
optim(c(-4,-4), f, df)$par
> Error in fn(par, ...) : argument "x2" is missing, with no default
所以我需要使用数组才能使用 optim。所以如果我写:
f <- function(x) (x[1]^2 + x[2])^2
x <- seq(-4.5,4.5,by=.2)
y <- seq(-4.5,4.5,by=.2)
s<-data.frame(cbind(x,y))
我可以使用优化:
optim(c(-4,-4), f, df)$par
但是outer报错:
z <- outer(s,f)
Error in as.vector(x, mode) : cannot coerce type 'closure' to vector of type 'any'
不知道怎么解决
我相信这里的目标是不必用两种不同的方式编写函数,对吧?
f0 <- function(x1,x2) ( x1^2 + x2 )^2
f <- function(x) ( x[1]^2 + x[2] )^2
同样,也许您只想使用 s<-data.frame(cbind(x,y))
(没有 x
和 y
)。
以下是我会考虑做的事情:
outer(s[[1]],s[[2]],Vectorize(function(xi,yi) f(c(xi,yi))))
这样您只需编写一次函数,就可以使用 optim
(使用单个参数)。
注意:如果你想让网格x
和y
有不同的点数,你应该存储s <- list(x,y)
.该代码将以相同的方式工作。