【问题标题】:Having a hard time with a sliding window in perl在 perl 中使用滑动窗口很难
【发布时间】:2017-08-09 00:04:06
【问题描述】:

我正在尝试在 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 sliding-window


【解决方案1】:

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

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 有特殊含义。您不应在示例中使用它们。

【讨论】:

  • 感谢您的回复。基本上我需要打印这样的东西。 1: SMA 2: SMA 3: SMA .... 20: SMA 然后从 1: SMA 重新开始。窗口大小为 20,但序列计数也是 20。
  • 你以为你在解释事情,但你真的不是:-)
  • 你只是在重复自己更多的词。也许edit your question 添加一个例子。并解释什么是“SMA”。
  • @kernel-trick 停止在 cmets 中填充东西。编辑和更新您问题中的信息。
  • @kernel-trick 如果你已经完成了它,请看What should I do when someone answers my question? 我建议以后更仔细地写问题。想想其他人在阅读它们时看到了什么。感谢您从非常有经验和优秀的人那里获得帮助,如果他们不必为这个问题摸不着头脑,他们将能够立即完全回答。
【解决方案2】:

从字里行间看,我猜你正在寻找模数运算符。

#!/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
...

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 2014-09-09
    • 1970-01-01
    • 2016-02-04
    • 2012-11-09
    • 1970-01-01
    • 2021-10-29
    • 2016-12-25
    相关资源
    最近更新 更多