2017-03-17 85 views
0

我試圖在perl中通過大型數組做一個滑動窗口,並且遇到了麻煩。細節是,我需要一個20號窗口,然後得到20個元素的平均值(SMA),然後打印出編號爲1到20的SMA,然後再從1開始.....我從這樣的事情開始但是我很難把我的腦袋想起來,我將如何去做。在perl中使用滑動窗口很困難

for($a=0;$a < $#numbers-$window;$a++) { 


      $c=1; 
      for($b=$a;$b < $a+$window;$b++) { 

      } 
    } 
+0

CPAN有幾個統計模塊。 – toolic

+2

澄清這樣一個問題的一個好方法是給出樣本輸入和輸出。 –

回答

2

這不是真的清楚你問什麼,但我想我會這樣開始:

foreach (0 .. $#numbers - 20) { 
    my @window = @numbers[$_ .. $_ + 20]; 
    # Do something with @window 
    ... 
} 

還是這個,這不,每次重新分配整個數組:

my @window = @numbers[0 .. 19]; 

foreach (20 .. $#numbers) { 
    # Do something with @window. 
    ... 

    # Then get the next version of @window ready 
    shift @window; 
    push @window, $numbers[$_]; 
} 

有兩點要注意:

  1. C風格for循環幾乎總是錯誤的方法。
  2. 變量$a$b對Perl有特殊的含義。你不應該在例子中使用它們。
+0

感謝您的回覆。基本上我需要打印這樣的東西。 1:SMA 2:SMA 3:SMA .... 20:SMA,然後從1:SMA重新開始。窗口大小爲20,但序列數也是20。 –

+1

你認爲你解釋的東西,但你真的不是:-) –

+0

讓我看看我能否更好地解釋....你有一個100000數字的數組。我知道你知道什麼是滑動窗口....所以,當你用滑動窗口瀏覽你的數組時,你會得到並在每個窗口中打印數據的SMA。我知道該怎麼做。我無法打包的是如何打印每個窗口的SMA並將其編號爲一個值,比如說50. –

1

在行之間讀取,我猜測你正在尋找模數運算符。

#!/usr/bin/env perl 

use strict; 
use warnings; 

use List::Util qw(sum); 

use constant WINDOW_SIZE => 20; 

my @data = (1 .. 10_000); 
my @window = @data[0 .. (WINDOW_SIZE - 1)]; 
my $n = 1; 

for my $i (WINDOW_SIZE .. $#data) { 
    my $avg = sum(@window)/@window; 
    printf "%d: %.3f\n", ($n % WINDOW_SIZE) + 1, $avg; 
    shift @window; 
    push @window, $data[$i]; 
    ++$n; 
} 

輸出示例:

1: 10.500  
2: 11.500  
3: 12.500  
4: 13.500  
5: 14.500  
6: 15.500  
7: 16.500  
8: 17.500  
9: 18.500  
10: 19.500  
11: 20.500  
12: 21.500  
13: 22.500  
14: 23.500  
15: 24.500  
16: 25.500  
17: 26.500  
18: 27.500  
19: 28.500  
20: 29.500  
1: 30.500  
2: 31.500  
3: 32.500 
...