1

我有一个名为 dv(日值)的 365x1 矢量。我正在应用一个函数来生成一些每小时值,hv。我的代码如下:

sigma<-0.246*dv
stime<-function(x,y,z){(exp(-(x-12)^2/(2*y^2))+cos(pi*(x-12)/(z-1)))/(2*y*sqrt(2*pi))}
t<-1:24
hv<-NULL
for (i in seq(along=t)){hv<-c(hv,mapply(stime,t[i],sigma,dv))}

我想使用t[1],t[2],...t[24]with的前 24 个值z=dv[1]和要使用的下 24 个值z=dv[2]等。但是这段代码的作用是先取 365 个值dv[1],dv[2]...dv[365]t[1]然后取接下来的 365 个值t[2]......我不确定我是否解释清楚. 我真的很感谢你的帮助。

4

2 回答 2

1

expR 对,和所有算术运算符都进行了矢量化处理cossqrt因此您真正需要做的就是沿着您的dv值循环。

这是一个使用您的函数的示例sapply,为了简洁起见,只有前 3 个t值...

dv <- 1:5
sapply( dv , function(i) stime( x = t[1:3] , y = 0.246*i , z = i ) )

     [,1]       [,2]          [,3]       [,4]          [,5]
[1,]  NaN -0.4054291 -6.621773e-16  0.1013573 -1.146727e-01
[2,]  NaN  0.4054291 -2.702861e-01 -0.1013573  7.689812e-16
[3,]  NaN -0.4054291  1.489523e-16 -0.2027146  1.146727e-01

所以有一个值 for z(这是当前dv值),一个值y是 0.246 * 当前dv值,以及 3 个值tfor x。输出为 3 个值,每个 1 个t,sigma 和dv值每次都被回收和重用。

第一列中的NaNs 是由于在本例中 和 的第一个值t也是dv1,这导致

cos(pi * (1 - 12)/(1 - 1))

简化为;

cos(-Inf)
NaN

所以结果必须NaN在这个例子中(希望在你的真实数据中不是这样)。

于 2013-08-09T21:19:40.733 回答
1

也许:

hv <- stime( x =rep(dv, each= 24), y=rep(1:24, each=365), z=x)
于 2013-08-09T22:21:20.143 回答