in reply to Re: how to convert two lists into adjacency matrix
in thread how to convert two lists into adjacency matrix

I think you misread the O.P. This isn't about comparing lists, and your code snippet can't get there.

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
    Hi QM, Your code has bee very helpful. Afters days of searching I now finally found this post/site and has given me faith I can do what I need (only a Perl beginner/hacker) Wondering if you could please help me do somthing like this.. which counts and is additive on multiple line items. id1 id2 int 208 10000 1 208 10000 7 207 10000 3 8517 1147 1 3551 1147 2 id1\id2 1147 10000 207 0 3 208 0 8 3551 1 0 8517 1 2 I will be forever in your gratitude!
Re^3: how to convert two lists into adjacency matrix
by jaybode (Initiate) on Nov 06, 2009 at 14:00 UTC
    Hi QM, Your code has bee very helpful. Afters days of searching I now finally found this post/site and has given me faith I can do what I need (only a Perl beginner/hacker) Wondering if you could please help me do somthing like this.. which counts and is additive on multiple line items.
    id1 id2 int 208 10000 1 208 10000 7 207 10000 3 8517 1147 1 3551 1147 2 id1\id2 1147 10000 207 0 3 208 0 8 3551 1 0 8517 1 2
    I will be forever in your gratitude!