2015-09-28 2 views
-3

У меня вопрос довольно глупый.Неправильное получение среднего значения массива чисел

входные данные:


No:20 2.23 5.5 101 404 26.3 
    No:01 2.40 5.3 100 404 25.7 
    No:02 2.30 5.6 100 405 25.4 
    No:03 2.39 5.3 100 404 25.5 

    No:07 2.61 4.9 100 404 25.4 
    No:08 2.53 
    No:09 2.41 5.4 101 404 25.4 
    No:10 2.59 5. 100 404 25.4 
    No:11 2.55 5.4 101 404 25.3 
    No:12 2.3 5.3 100 404 25.5 
    No:13 2.47 5.2 100 404 25. 
    No:14 2.25 5.1 100 404 25.6 
    No:15 2.24 5.1 100 404 25.7 

    No:17 2.57 5.0 100 404 25.5 
    No:18 2.45 5.2 101 404 25.5 
    No:04 2.51 5.5 100 404 25.4 
    No:05 2.38 5.1 101 405 25.5No:04 2.51 5.5 100 404 25.4 
    No:06 2.29 5.1 100 405 25.3 
    No:07 2.53 4.9 100 404 25.4 
    No:08 2.41 5.2 100 404 25.5 
    No:07 2.46 4.9 100 404 27.6 
    No:05 2.23 5.1 100 404 25.0�� 
    o:09 2.39 5.3 100 404 26.4 
    No:01 2.49 5.3 101 404 26.8 
    No:02 2.21 5.5 101 404 26.2 

______________________________________and более

Я хочу, чтобы каждый сто конца средней линии элемента.

#!usr/bin/perl 
use utf8; 
while(<>){ 
    if(/^No:\d{2}\s{3}  \d\.\d{2}s{4} \d\.\d\s{3} \d{3}s{3} \d{3}s{3} \d{2}\.\d\s$/x){ 
     chomp; 
     push @Array,[split/\s+/]; 
    } 
} 

foreach (0..$#Array/100){ 
    my $average=0; 
    $average += $Array[$_][5]/100 foreach($_..$_+100); 
    print "this is $average \n"; 
} 

выход (средний)

23.836 
26.5630000000001 
26.462 
26.462 
26.361 
26.462 
26.5630000000001 
29.694 
26.664 
26.967 

** использовать MS Excel **

25.9530 
25.4850 
25.7610 
25.3160 
25.1650 
25.7060 
25.9500 
25.6800 
25.4720 
25.4820 
+4

Что конкретно вопрос? – Sobrique

+1

Предположительно, ваша проблема в том, что ваша функция дает разные значения, чем возвращает Excel. В качестве первого шага попробуйте сделать гораздо меньшую проблему, скажем, 10 рядов и возьмите среднее каждые 5 строк. Затем вы можете вручную вычислить ответ, чтобы решить, является ли ваша функция или (способ использования) Excel неправильной. – JenB

+0

О чем ты говоришь? Для программы и данных, которые вы предоставили, на самом деле это «0». Пожалуйста, исправьте свой вопрос. – ikegami

ответ

0

Вы собираетесь через данные неправильно. На первом проходе вы смотрите значения 0-99, а затем на втором проходе вы смотрите 1-100, затем 2-101 и т. Д. Похоже, вы хотите сделать 0-99, а затем 100-199 и так далее, мог бы сделать что-то вроде:

my $chunks = $#Array/100; 

foreach my $chunk (0 .. $chunks) { 
    my $low = 100 * $chunk; 
    my $high = $low + 100; 
    $high = $#Array if $high > $#Array; 
    my $sum = 0; 
    foreach my $n ($low .. $high) { 
     $sum += $Array[$n][5]; 
    } 
    my $avg = $sum/($high - $low); 
    print "avg=$avg\n"; 
} 
Смежные вопросы