R - 将此嵌套for循环(MATLAB)转换为R

时间:2013-05-13 04:41:14

标签: r

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

1 个答案:

答案 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