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

妮莎

我想规范化我的数据。我写了这段代码:

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 "$i\t$data[$i][0]\t$data[$i][1]\t$max1\t";
  $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$max1\n";
}

然而,这产生了一个错误:最大位置之前的所有值都除以最大值,而最大位置之后的值不变,就好像“ / $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 "$i\t$data[$i][0]\t$data[$i][1]\t$max1\t";
  #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$max1\n";
}

我对第一部分代码做错了什么?

鲍罗丁

原始代码的问题在于,在修改数组的过程中, 的值$i将等于$max1这意味着声明

$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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章