in reply to Re: how to convert two lists into adjacency matrix
in thread how to convert two lists into adjacency matrix
Maybe this will do:
use strict; use warnings; my @id1 = (1..5); my @id2 = (11..15); my %hash; my %col_header; my %row_header; my $last = $#id1 > $#id2 ? $#id1 : $#id2; for my $i (0..$last) { if ( defined( $id2[$i] ) ) { $col_header{$id2[$i]} = 1; } if ( defined( $id1[$i] ) ) { $row_header{$id1[$i]} = 1; } if ( defined( $id1[$i] ) and defined( $id2[$i] ) ) { $hash{$id1[$i]}{$id2[$i]} = 1; } } my @col_header = sort numeric keys %col_header; my @row_header = sort numeric keys %row_header; printf "%10s" x (@col_header + 1), "id1\\id2", @col_header; print "\n"; for my $row ( @row_header ) { printf "%10s", "$row"; for my $col ( @col_header ) { printf "%10s", ( exists( $hash{$row}{$col} ) ? "1" : "0"); } print "\n"; } sub numeric { $a <=> $b; }
with output:
id1\id2 11 12 13 14 15 1 1 0 0 0 0 2 0 1 0 0 0 3 0 0 1 0 0 4 0 0 0 1 0 5 0 0 0 0 1
(I'll leave it to OMAR to turn this into a sub.)
Update: here's the read-from-STDIN version:
use strict; use warnings; my $pair_name; while (<>) { $pair_name = join '\\', split; last; } my %hash; my %col_header; my %row_header; while (<>) { my @pair = split; $hash{$pair[0]}{$pair[1]} = $row_header{$pair[0]} = $col_header{$pair[1]} = 1; } my @col_header = sort numeric keys %col_header; my @row_header = sort numeric keys %row_header; printf "%10s" x (@col_header + 1), $pair_name, @col_header; print "\n"; for my $row ( @row_header ) { printf "%10s", "$row"; for my $col ( @col_header ) { printf "%10s", ( exists( $hash{$row}{$col} ) ? "1" : "0"); } print "\n"; } sub numeric { $a <=> $b; }
-QM
--
Quantum Mechanics: The dreams stuff is made of
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: how to convert two lists into adjacency matrix
by jaybode (Initiate) on Nov 06, 2009 at 13:59 UTC | |
|
Re^3: how to convert two lists into adjacency matrix
by jaybode (Initiate) on Nov 06, 2009 at 14:00 UTC |