2017-03-07 12 views
0

データを正規化したい。私はこのコードを書いた: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"; 
} 

しかし、これはエラー生成:最大位置後の値が変更されませんしながら、 "/ $データかのように最大位置までのすべての値は、最大値で除算されている[$の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"; 
} 

を?

+2

私は、入力サンプルデータと必要な出力が必要だと思います。これは....厄介に見えます。 – Sobrique

答えて

3

元のコードの問題は、配列を変更する途中で、$iの値が$max1に等しくなることです。それは

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

が10,000 $data[$i][1]を設定

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

と同等になりますstatememtを意味します。その後、あなたは変わらない値を残し

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

を行っている

使用すると、1つが必要な場合解決策は、修正

からそれを安全に保つためにループの前に別の変数への最大値を抽出することである

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

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

あなたへの割り当てを変更します2番目の試行は正確に機能するので、ファクタを安全に保ちます$max1