2013-03-26 78 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

這個腳本必須添加到我的?如果我用我生成的數據創建輸出文件,我只需要將文件句柄$ fh放入while(<>)中? – 2013-03-26 12:00:19

+0

如果我只是將它添加到完整的腳本中,它什麼都不會產生。 – 2013-03-26 12:07:35

+0

@ ValerioD.Ciotti是的。或者你可以用'$ _ =「$ i $ j」'替換'say'$ i $ j'',並將'chomp;'的邏輯粘貼到第二個'push'(排除next if行)到您的腳本將兩個腳本結合在一起。不要忘記聲明變量。 – 2013-03-26 12:09:17

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是用於矢量長度的嗎? – 2013-03-26 11:25:31

+0

'Math :: Random :: MT :: rand'模仿Perl的內置[rand](http://perldoc.perl.org/functions/rand.html)。 '$ MAX_LENGTH'是一個向量的最大長度,'$ MAX_RAND'是可以在向量中的最大數量。 – 2013-03-26 11:28:40

+0

我無法知道最大長度或可以在矢量中的最大值,因爲它只是隨機的。我知道在perl中,不需要像在C或其他語言中那樣知道向量的長度。沒有寫入最大值的情況下,是否有可變的變量? – 2013-03-26 11:35:47