Как рассчитать разницу между каждым элементом в двух массивах? - PullRequest
2 голосов
/ 01 марта 2011

У меня есть текстовый файл с номерами, которые я сгруппировал следующим образом, разделенные пустой строкой:

42.034 41.630 40.158 26.823 26.366 25.289 23.949

34.712 35.133 35.185 35.577 28.463 28.412 30.831

33.490 33.839 32.059 32.072 33.425 33.349 34.709

12.596 13.332 12.810 13.329 13.329 13.569 11.418

Примечание: группы всегда имеют одинаковую длину и могут быть расположены более чем в одну строку, если группа большая, скажем, 500 чисел. Я думал о том, чтобы поместить группы в массивы и выполнить итерацию по длине файла.

Мой первый вопрос: как мне вычесть первый элемент массива 2 из массива 1, массив 3 из массива 2, аналогично для второго элемента и так далее до конца группы?

т.е:.

34.712-42.034,35.133-41.630,35.185-40.158 ...till the end of each group

33.490-34.712,33.839-35.133   ..................

и затем сохранить различия первого элемента в одной группе (второй вопрос: как?) До конца

т.е:.

34.712-42.034 ; 33.490-34.712 ; and so on in one group

35.133-41.630 ; 33.839-35.133 ; ........

Я новичок, поэтому любые предложения будут полезны.

Ответы [ 2 ]

6 голосов
/ 01 марта 2011

При условии, что у вас открыт файл, приведен быстрый набросок

use List::MoreUtils qw<pairwise>;
...

my @list1 = split ' ', <$file_handle>;
my @list2 = split ' ', <$file_handle>;

my @diff  = pairwise { $a - $b } @list1, @list2;

pairwise - самый простой способ.

В противном случае есть старый режим ожидания:

# construct a list using each index in @list1 ( 0..$#list1 )
# consisting of the difference at each slot.
my @diff = map { $list1[$_] - $list2[$_] } 0..$#list1;
0 голосов
/ 06 апреля 2011

Вот остальная часть инфраструктуры, чтобы заставить код Axeman работать:

#!/usr/bin/perl
use strict;
use warnings;
use List::MoreUtils qw<pairwise>;

my (@prev_line, @this_line, @diff);
while (<>) {
    next if /^\s+$/; # skip leading blank lines, if any
    @prev_line = split;
    last;
}

# get the rest of the lines, calculating and printing the difference,
# then saving this line's values in the previous line's values for the next
# set of differences
while (<>) {
    next if /^\s+$/; # skip embedded blank lines

    @this_line = split;
    @diff      = pairwise { $a - $b } @this_line, @prev_line;

    print join(" ; ", @diff), "\n\n";

    @prev_line = @this_line;
}

Итак, с учетом ввода:

1 1 1

3 2 1

2 2 2

Вы получите:

2 ; 1 ; 0

-1 ; 0 ; 1
...