将R代码转换为MATLAB代码:卡在sapply()上
我有下面的R代码,我正在尝试将其转换为MATLAB。(不,我不想在MATLAB中运行如图所示的R代码) R代码如下:将R代码转换为MATLAB代码:卡在sapply()上,r,matlab,debugging,R,Matlab,Debugging,我有下面的R代码,我正在尝试将其转换为MATLAB。(不,我不想在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/sqr
# 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)
所以,这就是我被困的地方。我不明白sumn=sapply(ts,FUN=function(tb)sum(pstb
”来自哪里。它也没有在给定的R代码中定义
有谁能告诉我,在MATLAB中,函数R代码的等价物是什么
[编辑1:更新]
因此,根据@Croote的评论,我为
sapply()
然而,我没有得到预期的结果。曲线应该相互重叠:蓝色曲线是正确的,因此橙色需要与蓝色曲线重叠
我错过了什么?R的pnorm()
是否等同于我在这里所做的MATLAB的normcdf()
[编辑2:找到错误!]
所以,在闲逛之后,我发现我所要做的就是获得tb
的出现次数。行summat=sumidx.*repmat(ps,300,1)
不应该在那里。删除该行并保持sumn=sum(sumidx,2)代码>,我得到了想要的结果
因此,根据@Croote的评论,经过反复研究,我为sapply()中定义的函数提供了以下代码
对于情节,我把它编码为
sumnfin = sumn(2:end)-sumn(1:end-1);
plot(t(1:length(sumn)-1),sumnfin)
最后,我得到了期望的结果
sapply
将定义为function(tb){sum(ps
的函数应用于列表或向量ts
,并返回列表。它就像一个forloop,将一个函数应用于列表中的每个元素。因此,tb
仅作为变量占位符存在于所应用的函数中。函数取tb
的一个值,识别ps
中小于该特定tb
值的值,并将其相加。然后对剩余的tb
值重复相同的步骤?或者首先,它搜索所有tb
值,并在循环结束时求和?
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)
sumidx = bsxfun(@lt,ps,ts');
sumn = sum(sumidx,2);
sumnfin = sumn(2:end)-sumn(1:end-1);
plot(t(1:length(sumn)-1),sumnfin)