PERL:通过通过数组位置比较值VS,找到最大值然后除以最大值



我想将数据标准化。我写了此代码:

my $max1=0;
for (my $i=0; $i<=$#data; $i++) {
  if ($data[$i][1]>$data[$max1][1]) {$max1=$i;}
  #Disabled# if ($data[$i][1]>$max1) {$max1=$data[$i][1];}
}
for (my $i=0; $i<=$#data; $i++) {
  print "$it$data[$i][0]t$data[$i][1]t$max1t";
  $data[$i][1] = $data[$i][1] / $data[$max1][1] * 10000;
  #Disabled# $data[$i][1] = $data[$i][1] / $max1 * 10000;
  print "$data[$i][0]t$data[$i][1]t$max1n";
}

然而,这产生了一个错误:最高位置的所有值都除以最大值,而最大位置后的值则不变,好像"/$ data [$ max1] [1] * 10000从未发生过。

但是,如果我使用值而不是通过数组位置更改比较,我得到了正确的结果:

my $max1=0;
for (my $i=0; $i<=$#data; $i++) {
  #Disabled# if ($data[$i][1]>$data[$max1][1]) {$max1=$i;}
  if ($data[$i][1]>$max1) {$max1=$data[$i][1];}
}
for (my $i=0; $i<=$#data; $i++) {
  print "$it$data[$i][0]t$data[$i][1]t$max1t";
  #Disabled# $data[$i][1] = $data[$i][1] / $data[$max1][1] * 10000;
  $data[$i][1] = $data[$i][1] / $max1 * 10000;
  print "$data[$i][0]t$data[$i][1]t$max1n";
}

我对代码的第一位做了什么?

原始代码的问题是,通过修改数组的一部分,$i的值将等于$max1。这意味着statememt

$data[$i][1] = $data[$i][1] / $data[$max1][1] * 10000

将等效于

$data[$max1][1] = $data[$max1][1] / $data[$max1][1] * 10000

$data[$i][1]设置为10,000。此后,您正在做

 $data[$i][1] = $data[$i][1] / 10000 * 10000

留下不变的值

解决方案(如果需要的话)是在循环之前将最大值提取到单独的变量中,以使其免受修改

my $maxval =  $data[$i][1]

并将作业更改为

 $data[$i][1] = $data[$i][1] / $maxval * 10000

您的第二次尝试正确起作用,因为它确实如此,因此确保$max1

中的因子安全

相关内容

最新更新