2014-10-03 26 views
0

perl package Algorithm :: Cluster將一個鋸齒狀數組作爲一個輸入。有 是在該包14_kmedoids.t其中包含這樣的示例:使用push爲Algorithm :: Cluster生成鋸齒陣列?

my $matrix = [ 
    [], 
    [ 3.4], 
    [ 4.3, 10.1], 
    [ 3.7, 11.5, 1.1], 
    [ 1.7, 4.1, 3.4, 3.4], 
    [10.1, 20.5, 2.5, 2.7, 9.8], 
    [ 2.5, 3.7, 3.1, 3.6, 1.1, 10.1], 
    [ 3.4, 2.2, 8.8, 8.7, 3.3, 16.6, 2.7], 
    [ 2.1, 7.7, 2.7, 1.9, 1.8, 5.7, 3.4, 5.2], 
    [ 1.6, 1.8, 9.2, 8.7, 3.4, 16.8, 4.2, 1.3, 5.0], 
    [ 2.7, 3.7, 5.5, 5.5, 1.9, 11.5, 2.0, 1.7, 2.1, 3.1], 
    [10.0, 19.3, 1.0, 3.7, 9.1, 1.2, 9.3, 15.7, 6.3, 16.0, 11.5] 
]; 
my ($clusters, $error, $found); 
my %params1 = (
     nclusters =>   4, 
     distances => $matrix, 
     npass  =>  10000, 
($clusters, $error, $found) = Algorithm::Cluster::kmedoids(%params1); 

在該測試作品交錯數組的靜態聲明。但是,當我嘗試製作類似的鋸齒陣列動態時,使用如下推式:

my @sq_dm; 
    # code omitted that fills sq_dm with data 
    my @matrix; 
    for($i=0; $i<$rowcount;++$i){ 
     my @row=(); 
     for($j=0; $j<=$i;++$j){ 
     push @row, $sq_dm[$i][$j]; 
     } 
     push @matrix, @row; 
    } 

生成的矩陣不起作用。它失敗:

Row 0 is not an array at ./kcluster_my_script.pl line 119. 

其中線119是這一個:

($clusters, $error, $found) = Algorithm::Cluster::kmedoids(%params1); 

靜態矩陣似乎開始與一個空行,這可能是問題,但 怎麼可能一個推空行?那空行是否有特殊用途?

還要注意,在動態的一個是@matrix,而在靜態的一個是$矩陣。除非使用@matrix,否則我無法使用push構建鋸齒陣列。

這是RHEL 5.11上的per 5.8.8。

謝謝。

回答

1

你忘了把你的陣列的參考,打造出AoA:

push @matrix, \@row; 

欲瞭解更多信息複雜的結構,看看perldsc - Perl Data Structures Cookbook

這可能是過於雜亂,但你的初始化代碼可以壓縮到以下幾點:

my @matrix = map [ @{ $sq_dm[$_] }[ 0 .. $_ ] ], (0 .. $rowcount - 1); 
+0

謝謝,這工作。你可以在靜態聲明的第一行解釋空數組的目的嗎?如果它被省略,kmedoids函數會投訴並退出。是否有一些規則,一個數組或數組必須以一個空數組開始,還是隻是這個特定包的一個要求? – mathog 2014-10-06 18:51:35

+0

這只是該特定模塊的一個要求。 – Miller 2014-10-06 18:56:48