在perl中使用滑动窗口很困难
我试图在一个大数组上用perl做一个滑动窗口,但遇到了麻烦。细节是,我需要一个大小为20的窗口,然后得到20个元素的平均值(SMA),然后打印出编号为1到20的SMA,然后再从1开始…..我开始做类似的事情,但我很难思考如何去做在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++) { } }
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[$_];
}
几点注意:
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[$_];
}
几点注意:
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技巧如果你已经完成了,请参阅我建议以后更仔细地写问题。想想其他人在阅读时看到了什么。感谢你从经验丰富的优秀人士那里得到帮助,如果他们不必为这个问题绞尽脑汁,他们将能够立即完全回答。澄清此类问题的一个好方法是给出示例输入和输出。澄清此类问题的一个好方法是给出示例输入和输出。