增量二维数组单元格



我有一组数值数据,这对我来说很重要,因为我知道哪些数字对一起出现,以及出现了多少次。每组数据包含7个1到20之间的数字。有几百组数据。

本质上,通过解析我的每组数据,我想创建一个20 x 20的数组,我可以用它来记录数字对在一起出现的时间。

我做了很多搜索,但也许我用错了关键词。我已经看到了大量的例子如何创建一个"二维数组"——我知道perl实际上不这样做,它实际上是一个引用数组——并打印其中包含的值,但没有真正关于如何按数字处理一个特定的单元格并改变它。

下面是我的概念代码。注释行不起作用,但说明了我想要实现的目标。我对perl编码相当陌生,这对我来说似乎是高级的,可以理解我所看到的示例并将其转化为我可以实际使用的东西。

my @datapairs;
while (<DATAFILE>)
{
  chomp;
  my @data = split(",",$_);
  for ($prcount=0; $prcount <=5; $prcount++) 
  {
    for ($othcount=($prcount+1); $othcount<=6; $othcount++)
    {
        @data[$prcount]=@data[$prcount]+1;
        @data[$othcount]=@data[$othcount]+1;
        @data[$prcount]=@data[$prcount]-1;
        @data[$othcount]=@data[$othcount]-1;
        print @data[$prcount]." ".@data[$othcount]."; ";
        #@datapairs[@data[$prcount]][@data[$othcount]]++;
        #@datapairs[@data[$othcount]][@data[$prcount]]++;
    }
  }
}

在Perl中访问"二维数组"中的"单元格"(正如您已经发现的,这是一个数组ref的数组)非常简单:

my @datapairs;
# Add 1 for a pair with indexes $i and $j 
$datapairs[$i]->[$j]++;
print that value
print "$datapairs[$i]->[$j]n";

不清楚你说的"一起发生"是什么意思-如果你的意思是"在相同长度的7数组中",这很容易:

my @datapairs;
while (<DATAFILE>) {
    chomp;
    my @data = split(",", $_);
    for (my $prcount = 0; $prcount <= 5; $prcount++) {
        for (my $othcount = $prcount + 1; $othcount <=6 ; $othcount++) {
            $datapairs[ $data[$prcount] ]->[ $data[$othcount] ]++;
        }
    }
}
# Print
for (my $i = 0; $i < 20; $i++) {
    for (my $j = 0; $j < 20; $j++) {
        print "$datapairs[$i]->[$j], ";
    }
    print "n";
}

作为旁注,就个人而言,出于风格原因,我强烈倾向于引用一切,例如使用arrayref of arrayref而不是array of arrays。例如

my $datapairs;
# Add 1 for a pair with indexes $i and $j 
$datapairs->[$i]->[$j]++;
print that value
print "$datapairs->[$i]->[$j]n";

第二个(和第三个…)箭头解引用操作符在Perl中是可选的,但我个人发现强制使用它明显更具可读性——它将索引表达式分隔开。

最新更新