我有以下MATLAB代码,正在努力将其翻译为R:
nproc=40
T=3
lambda=4
tarr = zeros(1, nproc);
i = 1;
while (min(tarr(i,:))<= T)
tarr = [tarr; tarr(i, :)-log(rand(1, nproc))/lambda];
i = i+1;
end
tarr2=tarr';
X=min(tarr2);
stairs(X, 0:size(tarr, 1)-1);
从更新过程的角度来看,这是泊松过程。我在R中已经尽力了,但是我的代码出了点问题:
nproc<-40
T<-3
lambda<-4
i<-1
tarr=array(0,nproc)
lst<-vector('list', 1)
while(min(tarr[i]<=T)){
tarr<-tarr[i]-log((runif(nproc))/lambda)
i=i+1
print(tarr)
}
tarr2=tarr^-1
X=min(tarr2)
plot(X, type="s")
该循环将打印出一系列的数组,并且最后一个数组由其后的tarr
保存。
结果必须看起来像...
先谢谢您。所有有趣和支持性的评论都会得到奖励。
答案 0 :(得分:2)
在前面的注释上,matlab脚本中发生了一些R中没有的事情:
[tarr; tarr(i, :)-log(rand(1, nproc))/lambda];
是在矩阵中添加另一行,并用tarr(i, :)-log(rand(1, nproc))/lambda]
填充它。
您将需要使用其他方法,因为Matlab和R对这种类型的事物的处理方式不同。R: tarr[i]
和M: tarr(i, :)
相等的情况下使用它们,因为我认为您要实现的全部是给定行i
中的列,因此在R中看起来像tarr[i, ]
min
的使用也有所不同,因为R: min()
将返回矩阵的最小值(仅一个数字),而M: min()
将返回每一列的最小值。因此,在R中,您可以使用Rfast
软件包Rfast::colMins
。 stairs
部分是我不太熟悉的部分,但类似ggplot2::qplot(..., geom = "step")
的部分可能有用。现在我已经尝试创建在R中可用的东西,但不确定是否真正需要输出。但是,尽管如此,希望一些基础知识可以帮助您将它做好。下面是快速尝试实现目标的方法!
nproc <- 40
T0 <- 3
lambda <- 4
i <- 1
tarr <- matrix(rep(0, nproc), nrow = 1, ncol = nproc)
while(min(tarr[i, ]) <= T0){
# Major alteration, create a temporary row from previous row in tarr
temp <- matrix(tarr[i, ] - log((runif(nproc))/lambda), nrow = 1)
# Join temp row to tarr matrix
tarr <- rbind(tarr, temp)
i = i + 1
}
# I am not sure what was meant by tarr' in the matlab script I took it as inverse of tarr
# which in matlab is tarr.^(-1)??
tarr2 = tarr^(-1)
library(ggplot2)
library(Rfast)
min_for_each_col <- colMins(tarr2, value = TRUE)
qplot(seq_along(min_for_each_col), sort(min_for_each_col), geom="step")
如您所见,我对min_for_each_col
进行了排序,因此该图实际上是一个阶梯图,而不是一些随机的逐步图。我认为这是一个问题,因为从Matlab代码0:size(tarr2, 1)-1
得到的行数少了1,但我想不出为什么如果要获取colMins(并且有40列),我们将创建约20个步骤。但是我可能完全是误会!另外,我将T
更改为T0
,因为在R T
中以TRUE
的形式存在并且不好覆盖!
希望这会有所帮助!
答案 1 :(得分:1)
我对续订流程或Matlab不太熟悉,所以如果我误解了您的代码意图,请多多包涵。也就是说,让我们逐步分解R代码,看看发生了什么。
nproc
)零的数组。tarr[i] <= T
)的最小值。现在这可以工作,因为将TRUE和FALSE视为数字。即:TRUE == 1#返回TRUE
FALSE == 0#返回TRUE
TRUE == 0#返回FALSE
FALSE == 1#返回FALSE
但是,由于tarr [i]的值取决于随机数(请参见第8行),因此这可能导致同一代码在每次执行时都以不同的方式运行。这可能可以解释为什么代码“打印出大量的数组”。
for(i in 1:nrow(yourMatrix)){ //computations yourMatrix[i,] <- rowCreatedByComputations }
有关更多信息,请参见this答案。另外,由于每次运行的值都是固定数量的,因此您可以将它们保存在向量中,然后像下面这样简单地将每个循环附加到向量上:
vector <- c(vector,newvector)
第11行关闭循环语句。
然后在循环tarr2之后分配1 / tarr。同样,这是从上次循环(第8行)开始的40个值
然后为X分配tarr2的最小值。
还要注意,runif
是从均匀分布中取样的-如果您要寻找泊松分布,请参见:Poisson
希望这对您有所帮助!让我知道我还有什么可以做的。
答案 2 :(得分:1)
我今天下载了GNU Octave,以实际运行MatLab代码。看完运行的代码后,我花了几个星期的时间对@Croote的好答案
nproc <- 40
T0 <- 3
lambda <- 4
i <- 1
tarr <- matrix(rep(0, nproc), nrow = 1, ncol = nproc)
while(min(tarr[i, ]) <= T0){
temp <- matrix(tarr[i, ] - log(runif(nproc))/lambda, nrow = 1) #fixed paren
tarr <- rbind(tarr, temp)
i = i + 1
}
tarr2 = t(tarr) #takes transpose
library(ggplot2)
library(Rfast)
min_for_each_col <- colMins(tarr2, value = TRUE)
qplot(seq_along(min_for_each_col), sort(min_for_each_col), geom="step")
编辑:一些额外的绘图周-似乎更接近原始
qplot(seq_along(min_for_each_col), c(1:length(min_for_each_col)), geom="step", ylab="", xlab="")
#or with ggplot2
df1 <- cbind(min_for_each_col, 1:length(min_for_each_col)) %>% as.data.frame
colnames(df1)[2] <- "index"
ggplot() +
geom_step(data = df1, mapping = aes(x = min_for_each_col, y = index), color = "blue") +
labs(x = "", y = "")