Как вычесть значения в 2 разных массивах в Perl? - PullRequest
5 голосов
/ 16 августа 2011

Привет, у меня есть два массива, содержащих 4 столбца, и я хочу вычесть значение в столбце 1 массива2 из значения в столбце 1 массива1 и значение столбца 2 массива2 из столбца 2 массива1, т. Е. Пример:

my @array1=(4.3,0.2,7,2.2,0.2,2.4)
my @array2=(2.2,0.6,5,2.1,1.3,3.2)

, поэтому требуемый вывод

2.1 -0.4 2     # [4.3-2.2] [0.2-0.6] [7-5]
0.1 -1.1 -0.8  # [2.2-2.1] [0.2-1.3] [2.4-3.2]

Для этого я использовал код

my @diff = map {$array1[$_] - $array2[$_]} (0..2);          
print OUT join(' ', @diff), "\n";

и вывод, который я получаю сейчас,

2.1 -0.4 2
2.2 -1.1 3.8

Опять же, первая строка используется из первого массива, а не вторая, как мне решить эту проблему?

Мне нужны выходные данные в строках из 3 столбцов, как показано выше, поэтому я просто заполнил свой массив строкой из 3 значений.

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

Это даст запрошенный вывод. Тем не менее, я подозреваю (основываясь на ваших комментариях), что мы могли бы найти лучшее решение, если бы вы просто показали свой исходный вклад.

use strict;
use warnings;

my @a1 = (4.3,0.2,7,2.2,0.2,2.4);
my @a2 = (2.2,0.6,5,2.1,1.3,3.2);
my @out = map { $a1[$_] - $a2[$_] } 0 .. $#a1;

print "@out[0..2]\n";
print "@out[3..$#a1]\n";
4 голосов
/ 16 августа 2011

Прежде всего, ваш код даже не компилируется. Массивы Perl не разделены пробелами - вам нужно qw(), чтобы превратить их в массивы. Не уверен, как вы получили свои результаты.

Perl не имеет двухмерных массивов. 2.2 НЕ является столбцом 1 строки 1 @array1 - это элемент с индексом 3 @array1. Что касается Perl, ваша новая строка - это просто еще один разделитель пробелов, а НЕ то, что волшебным образом превращает 1-й массив в таблицу, как вы, кажется, думаете.

Чтобы получить желаемый результат (обработать эти 6 элементов как 2 3-элементных массива), вы можете либо сохранить их в массиве arrayrefs (реализация многомерных массивов C в Perl):

my @array1=( [ 4.3, 0.2, 7 ],
             [ 2.2, 0.2, 2.4] );


for(my $idx=0; $idx1 < 2; $idx1++) {
    for(my $idx2=0; $idx2 < 3; $idx2++) {
        print $array1[$idx1]->[$idx2] - $array2[$idx1]->[$idx2];
        print " ";
    }
    print "\n";
}

или вы можете просто подделать его, используя смещения, точно так же, как арифметика указателя работает в многомерных массивах C:

my @array1=( 4.3, 0.2, 7,      # index 0..2
             2.2, 0.2, 2.4);   # index 3..5


for(my $idx=0; $idx1 < 2; $idx1++) {
    for(my $idx2=0; $idx2 < 3; $idx2++) {
        print $array1[$idx1 * 3 + $idx2] - $array2[$idx1 * 3 + $idx2];
        print " ";
    }
    print "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...