Perl-返回数据集中的最大值
我以前从未深入研究过Perl,我发现它非常混乱,需要一些帮助。在下面的代码中,calc()部分返回“count”样本上的“input”的运行平均值。我想修改它,以便calc()返回样本集中的最大值。提前感谢您的帮助Perl-返回数据集中的最大值,perl,pdl,Perl,Pdl,我以前从未深入研究过Perl,我发现它非常混乱,需要一些帮助。在下面的代码中,calc()部分返回“count”样本上的“input”的运行平均值。我想修改它,以便calc()返回样本集中的最大值。提前感谢您的帮助 sub calc { my ($this, $dim, $input, $count) = @_; if ($count < 1) { warn "count=$count is less than 1."; retur
sub calc
{
my ($this, $dim, $input, $count) = @_;
if ($count < 1)
{
warn "count=$count is less than 1.";
return undef;
}
my $inputsum_in = $this->{inputsum};
my ($inputcumsum, $inputsum_out) = PDL::CumulativeSumOver2($input, $inputsum_in);
my $inputdelay = $this->delay('inputhistory', $input);
my $inputdelaysum_in = $this->{inputdelaysum};
my ($inputdelaycumsum, $inputdelaysum_out) = PDL::CumulativeSumOver2($inputdelay, $inputdelaysum_in);
$this->{inputsum} = $inputsum_out;
$this->{inputdelaysum} = $inputdelaysum_out;
my $sampleno = $this->{sampleno};
my $divider = $count;
if($sampleno < $count)
{
my $last = $dim - 1;
$divider = sequence($dim) + ($sampleno + 1);
my $start = $count - $sampleno;
$divider->slice("$start:$last") .= $count if $start <= $last;
$this->{sampleno} = $sampleno + $dim;
}
return ($inputcumsum - $inputdelaycumsum) / $divider;
}
子计算
{
my($this,$dim,$input,$count)=@;
如果($count<1)
{
警告“count=$count小于1。”;
返回未定义;
}
my$inputsum_in=$this->{inputsum};
my($inputcumsum,$inputsum_out)=PDL::CumulativeSumOver2($input,$inputsum_in);
my$inputdelay=$this->delay('inputhistory',$input);
my$inputdelaysum_in=$this->{inputdelaysum};
my($inputdelaycumsum,$inputdelaysum_out)=PDL::CumulativeSumOver2($inputdelay,$inputdelaysum_in);
$this->{inputsum}=$inputsum\u out;
$this->{inputdaysum}=$inputdaysum\u out;
my$sampleno=$this->{sampleno};
我的$divider=$count;
如果($sampleno<$count)
{
my$last=$dim-1;
$divider=序列($dim)+($sampleno+1);
my$start=$count-$sampleno;
$divider->slice(“$start:$last”)。=$count如果$start{sampleno}=$sampleno+$dim;
}
返回($inputcumsum-$inputdelaycumsum)/$divider;
}
如果要查找某个值列表中的最大值,无需编写自己的子例程。perl v5.7.3或更高版本附带了一个函数:
use List::Util qw(max); # core module since v5.7.3
use strict;
use warnings;
print max(1 .. 10); # prints 10
如果要查找某个值列表的最大值,则无需编写自己的子例程。perl v5.7.3或更高版本附带了一个函数:
use List::Util qw(max); # core module since v5.7.3
use strict;
use warnings;
print max(1 .. 10); # prints 10
怎么样
$max = max($input);
怎么样
$max = max($input);
编辑:这是你需要的循环
my $storedData = pdl;
# $storedData is now a vector containing one element, 0
while (! stopCondition()) {
my $input = readSensorData(); # step 1
$storedData = $storedData->append($input); # step 2
if ($storedData->nelem > $count) { # step 3
$storedData = $storedData->slice("-$count:-1");
# note that -1 points to the last element in a piddle and -X refers to
# the element X-1 away from the end (true for piddles and native arrays)
}
my ($max, $min) = evaluate($storedData); # step 4
}
我不确定这是否回答了你的问题,但你下面的评论似乎与你上面的问题大不相同。考虑编辑以上内容,以更好地反映你遇到的问题或提出一个新问题。
获得运行平均值的一种简单方法是使用有限脉冲响应滤波器,也称为卷积。用(标准化的)矩形脉冲卷积任何信号,得到运行平均值
my $filter = ones($count) / $count;
my $runningAve = convolveND($input, $filter);
my $max = $runningAve->max`;
还是一行
my $max = convolveND($input, ones($count) / $count)->max;
convolveND
这个方法有一点需要注意,那就是$runningAve piddle开头和结尾的值并不是真正的运行平均值。为确保输出的大小与输入的大小相同,
convolveND
(默认情况下)将零有效地连接到输入的开始和结束,结果是$runningAve
的前几个和最后几个元素低于实际运行平均值。(请注意,运行平均值原则上应该有N-(窗口-1)
元素,N是$input
的大小)由于这些“坏”值必然低于实际运行平均值,因此它们不会干扰您想要的最大值。(Re“默认情况下”:convolveND
有其他处理边的方法,您将在上面链接的文档中看到。)
(注意:我不是PDL专家。可能有一种比convolveND更便宜的方法来获得运行平均值,比如
$ra=$input->range(…)->sumover(0)/$count
,但我不知道你在…中放了什么,上面的内容是可读的。另请参见)编辑:这是你需要的循环
my $storedData = pdl;
# $storedData is now a vector containing one element, 0
while (! stopCondition()) {
my $input = readSensorData(); # step 1
$storedData = $storedData->append($input); # step 2
if ($storedData->nelem > $count) { # step 3
$storedData = $storedData->slice("-$count:-1");
# note that -1 points to the last element in a piddle and -X refers to
# the element X-1 away from the end (true for piddles and native arrays)
}
my ($max, $min) = evaluate($storedData); # step 4
}
我不确定这是否回答了你的问题,但你下面的评论似乎与你上面的问题大不相同。考虑编辑以上内容,以更好地反映你遇到的问题或提出一个新问题。
获得运行平均值的一种简单方法是使用有限脉冲响应滤波器,也称为卷积。用(标准化的)矩形脉冲卷积任何信号,得到运行平均值
my $filter = ones($count) / $count;
my $runningAve = convolveND($input, $filter);
my $max = $runningAve->max`;
还是一行
my $max = convolveND($input, ones($count) / $count)->max;
convolveND
这个方法有一点需要注意,那就是$runningAve piddle开头和结尾的值并不是真正的运行平均值。为确保输出的大小与输入的大小相同,
convolveND
(默认情况下)将零有效地连接到输入的开始和结束,结果是$runningAve
的前几个和最后几个元素低于实际运行平均值。(请注意,运行平均值原则上应该有N-(窗口-1)
元素,N是$input
的大小)由于这些“坏”值必然低于实际运行平均值,因此它们不会干扰您想要的最大值。(Re“默认情况下”:convolveND
有其他处理边的方法,您将在上面链接的文档中看到。)
(注意:我不是PDL专家。可能有一种比convolveND更便宜的方法来获得运行平均值,比如
$ra=$input->range(…)->sumover(0)/$count
,但我不知道你在…中放了什么,上面的内容是可读的。另请参见)他的代码已经使用了PDL。因此,$input很可能是一个“小杂烩”,而不是一个列表/数组。根据我的经验,list::Util
和PDL
不能很好地结合在一起。PDL定义了max
和min
,因此use
调用List::Util
版本的max和min会导致解释器拒绝运行脚本。他的代码已经使用了PDL。因此,$input很可能是一个“小杂烩”,而不是一个列表/数组。根据我的经验,list::Util
和PDL
d