0

我需要将此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
4

1 回答 1

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 
于 2013-05-13T07:46:59.547 回答