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 万要素の true 値と false 値の 1 次元ベクトルです。

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た。正しくて速い方法は次のとおりです。startstart

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 に答える