2017-03-07 82 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。這意味着statememt

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

將相當於

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

這臺$data[$i][1] 10000。此後,你正在做

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

留下不變的值

的解決方案,如果你需要一個,是循環之前提取最大值爲一個獨立的變量,以保證它的安全,從修改

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

,改變分配

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

你第二次嘗試正常工作,因爲它確實如此,保持因素安全$max1