2010-10-01 55 views
1

功能(列)在製表符分隔的所有可能的組合我有一個看起來像這樣的數據:查找數據

1 1:-0.394668 2:-0.794872 3:-1 4:-0.871341 5:0.9365 6:0.75597 
1 1:-0.463641 2:-0.897436 3:-1 4:-0.871341 5:0.44378 6:0.121824 
1 1:-0.469432 2:-0.897436 3:-1 4:-0.871341 5:0.32668 6:0.302529 
-1 1:-0.241547 2:-0.538462 3:-1 4:-0.871341 5:0.9994 6:0.987166 
1 1:-0.757233 2:-0.948718 3:-1 4:-0.871341 5:-0.33904 6:0.915401 
1 1:-0.167147 2:-0.589744 3:-1 4:-0.871341 5:0.95078 6:0.991566 

第一列是一流的,而接下來的6列的特點,我想找到所有可能的特徵組合(2個功能,3個功能,... 5個功能),

如:

feat1 - feat2 
feat1 - feat3 
... 
feat5 - feat6 
... 
feat1 - feat2 -feat3 -feat4 -feat 5 
feat1 - feat2 -feat3 -feat4 -feat 6 
..etc.. 

一個文件feat12.txt包含:

1 1:-0.394668 2:-0.794872 
1 1:-0.463641 2:-0.897436 
1 1:-0.469432 2:-0.897436 
-1 1:-0.241547 2:-0.538462 
1 1:-0.757233 2:-0.948718 
1 1:-0.167147 2:-0.589744 

Perl中是否有任何現有的實現?

+2

我相信您的問題聲明,使有很大的意義給你,因爲你一直在努力了很長一段時間。 – 2010-10-01 16:35:26

+0

它看起來像每個班(行)你有6個功能。你如何指定具有「2個特徵」的東西?你是指相似還是「共同」? – Axeman 2010-10-01 16:36:42

+1

第一列中'-1'的意義是什麼? – 2010-10-01 16:40:12

回答

4

當然有Algorithm::Combinatorics和/或Set::CrossProduct但是很難從你的問題描述中找出哪一個更合適。

Maybe you can use something like this as a starting point: 

#!/usr/bin/perl 

use strict; use warnings; 
use Algorithm::Combinatorics qw(combinations); 

while (my $line = <DATA>) { 
    last unless $line =~ /\S/; 
    my $row = [ $line =~ /([1-6]:\S+)/g ]; 
    for my $i (2 .. 6) { 
     my $it = combinations($row, $i); 
     while (my $x = $it->next) { 
      print "@$x\n"; 
     } 
    } 
} 

__DATA__ 
1 1:-0.394668 2:-0.794872 3:-1 4:-0.871341 5:0.9365 6:0.75597 
1 1:-0.463641 2:-0.897436 3:-1 4:-0.871341 5:0.44378 6:0.121824 
1 1:-0.469432 2:-0.897436 3:-1 4:-0.871341 5:0.32668 6:0.302529 
-1 1:-0.241547 2:-0.538462 3:-1 4:-0.871341 5:0.9994 6:0.987166 
1 1:-0.757233 2:-0.948718 3:-1 4:-0.871341 5:-0.33904 6:0.915401 
1 1:-0.167147 2:-0.589744 3:-1 4:-0.871341 5:0.95078 6:0.991566 
C:\Temp> c 
1:-0.167147 2:-0.589744 3:-1 
1:-0.167147 2:-0.589744 4:-0.871341 
1:-0.167147 2:-0.589744 5:0.95078 
… 
2:-0.589744 3:-1 5:0.95078 6:0.991566 
2:-0.589744 4:-0.871341 5:0.95078 6:0.991566 
3:-1 4:-0.871341 5:0.95078 6:0.991566 
1:-0.167147 2:-0.589744 3:-1 4:-0.871341 5:0.95078 
1:-0.167147 2:-0.589744 3:-1 4:-0.871341 6:0.991566 
1:-0.167147 2:-0.589744 3:-1 5:0.95078 6:0.991566 
1:-0.167147 2:-0.589744 4:-0.871341 5:0.95078 6:0.991566 
1:-0.167147 3:-1 4:-0.871341 5:0.95078 6:0.991566 
2:-0.589744 3:-1 4:-0.871341 5:0.95078 6:0.991566 
1:-0.167147 2:-0.589744 3:-1 4:-0.871341 5:0.95078 6:0.991566