Perl-返回数据集中的最大值

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

我以前从未深入研究过Perl,我发现它非常混乱,需要一些帮助。在下面的代码中,calc()部分返回“count”样本上的“input”的运行平均值。我想修改它,以便calc()返回样本集中的最大值。提前感谢您的帮助

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