Perl语言中的向量分块算法

Perl语言中的向量分块算法,perl,vector,hash,Perl,Vector,Hash,我有以下向量: 19.01 20.2572347267 16.4893617021 19.0981432361 36.3636363636 20.41 它实际上要长得多,但这并不重要。我需要一个算法将这些值放入散列。散列键必须是从最小值+1(在本例中为17.48…)开始并增加1的浮点值。散列的值必须是落入相应bin的元素数,即最终结果应为: $hash{17.49}=1 $hash{18.49}=0 $hash{19.49}=2 $hash{20.49}=2 $hash{21.49}=0 $h

我有以下向量:

19.01
20.2572347267
16.4893617021
19.0981432361
36.3636363636
20.41
它实际上要长得多,但这并不重要。我需要一个算法将这些值放入散列。散列键必须是从最小值+1(在本例中为17.48…)开始并增加1的浮点值。散列的值必须是落入相应bin的元素数,即最终结果应为:

$hash{17.49}=1
$hash{18.49}=0
$hash{19.49}=2
$hash{20.49}=2
$hash{21.49}=0
$hash{22.49}=0
.
.
.
$hash{35.49}=0
$hash{37.49}=1
请帮助大家。

这似乎有效:

#!/usr/bin/perl
use warnings;
use strict;

use Data::Dumper;

use List::Util qw{ min };

my @vector = qw( 19.01
                 20.2572347267
                 16.4893617021
                 19.0981432361
                 36.3636363636
                 20.41
              );

my %hash;

my $min = min(@vector);

for my $n (@vector) {
    my $diff = $n - $min;
    ++$hash{ 1 + $min + int $diff };
}

print Dumper \%hash;
如果还需要零,只需在循环之前添加以下内容:

my $max = max(@vector);

my $i = $min;
while ($i <= $max) {
    $hash{$i++} = 0;
}
my$max=max(@vector);
我的$i=$min;

虽然($i提出了一个很好的解决方案,但希望其他人也会觉得它有帮助

use POSIX;

sub frac { $_[0]-floor($_[0]) } #saw this little function posted somewhere, quddos to the guy who came up with it

for (my $x = ${min_value} + 1; $x <= ${max_value} + 1; $x += 1) # if you don't need the zeroes, remove this loop
{
  $bins{$x} = 0;
}

foreach my $n (@array)
{
$bins{floor($n+1)+frac($min_value)}++;
}
使用POSIX;
sub frac{$\[0]-floor($\[0])}在某处看到了这个小函数,向提出它的人发问

对于(我的$x=${min_value}+1;$x,您的问题到底是什么?非常感谢choroba。有人能想出一些更简单的方法吗,因为我需要了解代码是如何工作的。我的解决方案似乎对测试向量有效,但我不完全确定。