2013-03-26 3 views
0

я написал следующую программу:Создание векторов разной длины в Perl

use strict; 
use warnings; 
use 5.010; 

my $nodesNumber = 100 ; 
my $communitiesNumber = 10; 
my $prob_communities = 0.3; 

for my $i (1 .. $nodesNumber){ 
    for my $j (1 .. $communitiesNumber){ 
     my $random_number=rand(); 
     if ($prob_comunities > $random_number){ 
      say "$i $j"; 
     } 
    } 
} 

Эта программа дает в качестве вывода список из двух столбцов целых чисел, как:

1 2 
1 4 
2 2 
2 5 
2 7 
... 

Я хотел бы создать вектор, в котором первый элемент в левом столбце подсчитывается один раз, а правые элементы столбца представляют значение компонентов вектора. Я хотел бы, чтобы результат выглядел следующим образом:

vector[0][0]= 1 
vector[0][1]= 2 
vector[0][2]= 4 
vector[1][0]= 2 
vector[1][1]= 2 
vector[1][2]= 5 
vector[1][3]= 7 

Любая помощь?

ответ

1
#!/usr/bin/env perl 
# file: build_vector.pl 

use strict; 
use warnings; 

my @vector;  # the 2-d vector 
my %mark;   # mark the occurrence of the number in the first column 
my $index = -1; # first dimensional index of the vector 

while (<>) { 
    chomp; 
    my ($first, $second) = split /\s+/; 
    next if $second eq ''; 
    if (not exists $mark{$first}) { 
     $mark{ $first } = ++$index; 
     push @{ $vector[$index] }, $first; 
    } 
    push @{ $vector[$index] }, $second; 
} 

# dump results 
for my $i (0..$#vector) { 
    for my $j (0..$#{ $vector[$i] }) { 
     print "$vector[$i][$j] "; 
    } 
    print "\n"; 
} 

Этот сценарий будет обрабатывать выход вашего сценария и построить вектор в @vector. Если сценарий имеет имя файла generator.pl, вы можете позвонить:

$ perl generator.pl | perl build_vector.pl 

UPDATE:

use strict; 
use warnings; 

my $nodesNumber = 100 ; 
my $communitiesNumber = 10; 
my $prob_communities = 0.3; 

my @vector;  # the 2-d vector 
my %mark;   # mark the occurrence of the number in the first column 
my $index = -1; # first dimensional index of the vector 

for my $i (1 .. $nodesNumber){ 
    for my $j (1 .. $communitiesNumber){ 
    my $random_number=rand(); 
     if ($prob_communities > $random_number){ 
      if (not exists $mark{$i}) { 
       $mark{ $i } = ++$index; 
       push @{ $vector[$index] }, $i; 
      } 
      push @{ $vector[$index] }, $j; 
     } 
    } 
} 

# dump results 
for my $i (0..$#vector) { 
    for my $j (0..$#{ $vector[$i] }) { 
     print "$vector[$i][$j] "; 
    } 
    print "\n"; 
} 
+0

Этот скрипт должен быть добавлен к моему? Если я создаю выходной файл с данными, которые я сгенерировал, мне просто нужно поместить файл handle $ fh в while (<>)? –

+0

Если я просто добавлю его в полный скрипт, он ничего не даст. –

+0

@ ValerioD.Ciotti Да. Или вы можете заменить свой 'say '$ i $ j" 'на' $ _ =' $ i $ j "и вставить логику из' chomp; 'во второй' push' (при исключении строки 'next if') к вашему сценарию, чтобы объединить два сценария вместе. Не забудьте объявить переменные. –

0
#!/usr/bin/env perl 

use 5.010; 
use strict; 
use warnings; 

use Const::Fast; 
use Math::Random::MT; 

const my $MAX_RAND => 10; 

my $rng = Math::Random::MT->new; 

my @v = map { 
    my $l = $rng->irand; 
    [ map 1 + int($rng->rand($MAX_RAND)), 0 .. int($l) ]; 
} 1 .. 5; 

use YAML; 
print Dump \@v; 
+0

Может вы объяснить немного? случайное число, которое производится rand(), составляет от 0 до 1. Я вижу, что вы используете Math :: Random :: MT, это то же самое? MAX_LENGHTS для длин вектора? –

+0

'Math :: Random :: MT :: rand' имитирует встроенный Perl [rand] (http://perldoc.perl.org/functions/rand.html). '$ MAX_LENGTH' - максимальная длина вектора, а' $ MAX_RAND' - максимальное число, которое может быть в векторе. –

+0

Я не могу знать до максимальных длин или максимум, который может быть в векторе, потому что он просто случайный. Я знаю, что в perl нет необходимости знать длины вектора, как на C или других языках. Возможно ли иметь переменную без значения максимума? –

Смежные вопросы