R-外部有矩阵

时间:2015-02-13 18:50:30

标签: arrays r closures

假设我想最小化一个函数:

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:

optim(c(-4,-4), f, df)$par

但是外部会出错:

z <- outer(s,f)
  

as.vector(x,mode)出错:无法强制键入'closure'   'any'类型的向量

我不知道如何解决它。

1 个答案:

答案 0 :(得分:1)

我认为这里的目标是不必以两种不同的方式编写函数,对吧?

f0 <- function(x1,x2) ( x1^2   + x2   )^2
f  <- function(x)     ( x[1]^2 + x[2] )^2 

同样,您可能只想使用s<-data.frame(cbind(x,y))(不使用xy)。

以下是我会考虑做的事情:

outer(s[[1]],s[[2]],Vectorize(function(xi,yi) f(c(xi,yi))))

这样你只需要编写一次函数,就像使用optim(使用单个参数)一样。


注意:如果您希望网格xy的点数不同,则应存储s <- list(x,y)。代码也是一样的。