将R代码转换为MATLAB代码:卡在sapply()上

时间:2019-04-12 05:43:26

标签: r matlab debugging

我有以下R代码,我正在尝试将其转换为MATLAB。 (不,我不想像在here中那样在MATLAB中运行R代码)。

R代码在这里:

# model parameters
dt <- 0.001
t <- seq(dt,0.3,dt)
n=700*1000
D = 1
d = 0.5

# model
ft <- n*d/sqrt(2*D*t^3)*dnorm(d/sqrt(2*D*t),0,1)
fmids <- n*d/sqrt(2*D*(t+dt/2)^3)*dnorm(d/sqrt(2*D*(t+dt/2)),0,1)
plot(t,ft*dt,type="l",lwd=1.5,lty=2)

# simulation
#    
# simulation by drawing from uniform distribution
# and converting to time by using quantile function of normal distribution
ps <- runif(n,0,1)                
ts <- 2*pnorm(-d/sqrt(2*D*t))     
sumn <- sapply(ts, FUN = function(tb) sum(ps < tb))
lines(t[-length(sumn)],sumn[-1]-sumn[-length(sumn)],col=4)

到目前为止,我完成的MATLAB代码是

% # model
ft = (n*d)./sqrt(2*D.*t.^3).*normpdf(d./sqrt(2*D.*t),0,1);
fmids = (n*d)./sqrt(2*D*((t+dt)./2).^3).*normpdf(d./sqrt(2*D.*((t+dt)./2)),0,1);
figure;plot(t,ft.*dt);

% # simulation
% #    
% # simulation by drawing from uniform distribution
% # and converting to time by using quantile function of normal distribution
ps = rand(1,n);                
ts = 2*normcdf(-d./sqrt(2*D*t)); 

所以,这就是我被困住的地方。我不知道函数sumn = sapply(ts, FUN = function(tb) sum(ps < tb))的功能以及参数'tb'的来源。在给定的R代码中也未定义它。

有人可以告诉我MATLAB中该函数R代码的等效功能吗?

[编辑1:更新]

因此,根据@Croote的评论,我为sapply()

中定义的函数提供了以下代码
sumidx  = bsxfun(@lt,ps,ts');
summat  = sumidx.*repmat(ps,300,1);
sumn    = sum(summat,2);
sumnfin = sumn(2:end)-sumn(1:end-1);
plot(t(1:length(sumn)-1),sumnfin)

但是,我没有得到想要的结果。曲线应相互重叠:蓝色曲线正确,因此橙色需要与蓝色曲线重叠

enter image description here

我在这里想念什么?正如我在这里所做的那样,R的pnorm()是否等于MATLAB的normcdf()

[编辑2:发现了错误!]

因此,在摆弄之后,我发现我所要做的就是获得tb < pb的出现次数。 summat = sumidx.*repmat(ps,300,1)行不应该在那儿。删除该行并保留sumn = sum(sumidx,2);后,我得到了想要的结果。

enter image description here

1 个答案:

答案 0 :(得分:1)

因此,根据@Croote的评论并摆弄一下,我为sapply()中定义的功能想出了以下代码

sumidx  = bsxfun(@lt,ps,ts');
sumn    = sum(sumidx,2);

对于情节,我将其编码为

sumnfin = sumn(2:end)-sumn(1:end-1);
plot(t(1:length(sumn)-1),sumnfin)

最后,我得到了想要的结果

enter image description here