Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中使用滑动窗口很困难_Perl_Sliding Window - Fatal编程技术网

在perl中使用滑动窗口很困难

在perl中使用滑动窗口很困难,perl,sliding-window,Perl,Sliding Window,我试图在一个大数组上用perl做一个滑动窗口,但遇到了麻烦。细节是,我需要一个大小为20的窗口,然后得到20个元素的平均值(SMA),然后打印出编号为1到20的SMA,然后再从1开始…..我开始做类似的事情,但我很难思考如何去做 for($a=0;$a < $#numbers-$window;$a++) { $c=1; for($b=$a;$b < $a+$window;$b++) { } }

我试图在一个大数组上用perl做一个滑动窗口,但遇到了麻烦。细节是,我需要一个大小为20的窗口,然后得到20个元素的平均值(SMA),然后打印出编号为1到20的SMA,然后再从1开始…..我开始做类似的事情,但我很难思考如何去做

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


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

            }
    }
for($a=0;$a<$#数字-$window;$a++){
$c=1;
对于($b=$a;$b<$a+$window;$b++){
}
}

不太清楚你在问什么,但我想我应该这样开始:

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[$_];
}
几点注意:

  • C风格的
    for
    循环几乎总是错误的方法
  • 变量
    $a
    $b
    对Perl有特殊的意义。你不应该在例子中使用它们

  • 我不太清楚你在问什么,但我想我应该这样开始:

    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[$_];
    }
    
    几点注意:

  • C风格的
    for
    循环几乎总是错误的方法
  • 变量
    $a
    $b
    对Perl有特殊的意义。你不应该在例子中使用它们

  • 从字里行间,我猜你在找模算子

    #!/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 ... 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
    在字里行间,我猜你在寻找模运算符

    #!/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 ... 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
    …谢谢你的答复。基本上我需要打印这样的东西。1:SMA 2:SMA 3:SMA。。。。20:SMA,然后在1:SMA处重新开始。窗口大小将是20,但顺序也将是20。你认为你在解释事情,但你真的不是:-)你只是在用更多的词重复你自己。也许再举个例子。并解释什么是“SMA”。@不要在评论中塞进东西。编辑和更新问题中的信息。@kernel技巧如果你已经完成了,请参阅我建议以后更仔细地写问题。想想其他人在阅读时看到了什么。感谢您从经验丰富的优秀人士那里得到帮助,如果他们不必为这个问题费神,他们将能够立即完全回答。感谢您的回复。基本上我需要打印这样的东西。1:SMA 2:SMA 3:SMA。。。。20:SMA,然后在1:SMA处重新开始。窗口大小将是20,但顺序也将是20。你认为你在解释事情,但你真的不是:-)你只是在用更多的词重复你自己。也许再举个例子。并解释什么是“SMA”。@不要在评论中塞进东西。编辑和更新问题中的信息。@kernel技巧如果你已经完成了,请参阅我建议以后更仔细地写问题。想想其他人在阅读时看到了什么。感谢你从经验丰富的优秀人士那里得到帮助,如果他们不必为这个问题绞尽脑汁,他们将能够立即完全回答。澄清此类问题的一个好方法是给出示例输入和输出。澄清此类问题的一个好方法是给出示例输入和输出。