我需要将此for循环转换为R
for ii = 100:(size(start,1)-N)
if start(ii) == 1 && mean(start(ii-11:ii-1)) == 0
count = count + 1;
sif(count,:) = s(ii:ii+N-1);
time(count) = ii*1/FS;
end
end
起始矢量是真实和虚假值的单维向量,总共约300万个元素。
由于R中的循环需要很长时间,执行代码大约需要3个小时,因此需要进行矢量化。
如果有人可以提供帮助,我会非常感激。
修改
这是我的R代码,只有一个简单的计数(需要几个小时才能执行)
for(ii in 100:sp)
{
if(start(ii) == 1 && mean(start(ii-11:ii-1)) == 0)
{
count = count + 1
}
}
修改-2
以下是虚拟值:
start
:
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[13] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
N
:
[1] 882
FS
:
[1] 44100
s
:
[1] 1.762390e-01 1.797791e-01 1.826172e-01 1.795044e-01 1.724243e-01
[6] 1.665039e-01 1.640625e-01 1.634827e-01 1.628723e-01 1.606750e-01
答案 0 :(得分:1)
我刚创建了一些虚拟数据:
set.seed(1234)
start = sample(c(TRUE,FALSE), 300000, replace=TRUE)
N = 882
count = 0
您的R
代码需要:
system.time(
for(ii in 100:(length(start)-N))
{
if(start(ii) == 1 && mean(start((ii-11):(ii-1))) == 0)
{
count = count + 1
}
})
## user system elapsed
## 15.42 0.00 15.43
R
中有一个名为start
的函数,它被调用而不是索引向量start
。正确而快捷的方法是:
system.time(
for(ii in 100:(length(start)-N))
{
if(start[ii] == 1 && mean(start[(ii-11):(ii-1)]) == 0)
{
count = count + 1
}
})
## user system elapsed
## 2.04 0.00 2.04