Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

printf matrix

by madM (Beadle)
on Jan 06, 2014 at 12:40 UTC ( [id://1069505]=perlquestion: print w/replies, xml ) Need Help??

madM has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks and happy new year! I´m trying to print a matrix with this format but im not having further ideas on how to do this.. any suggestions?
# * column uses minimum score A R N D C Q E G H I L K M F P S T W Y V B Z X + * A 5 -2 -1 -2 -1 -1 -1 0 -2 -1 -2 -1 -1 -3 -1 1 0 -3 -2 0 -2 -1 -1 + -5 R -2 7 -1 -2 -4 1 0 -3 0 -4 -3 3 -2 -3 -3 -1 -1 -3 -1 -3 -1 0 -1 + -5 N -1 -1 7 2 -2 0 0 0 1 -3 -4 0 -2 -4 -2 1 0 -4 -2 -3 4 0 -1 + -5 D -2 -2 2 8 -4 0 2 -1 -1 -4 -4 -1 -4 -5 -1 0 -1 -5 -3 -4 5 1 -1 + -5 C -1 -4 -2 -4 13 -3 -3 -3 -3 -2 -2 -3 -2 -2 -4 -1 -1 -5 -3 -1 -3 -3 -2 + -5 Q -1 1 0 0 -3 7 2 -2 1 -3 -2 2 0 -4 -1 0 -1 -1 -1 -3 0 4 -1 + -5 E -1 0 0 2 -3 2 6 -3 0 -4 -3 1 -2 -3 -1 -1 -1 -3 -2 -3 1 5 -1 + -5 G 0 -3 0 -1 -3 -2 -3 8 -2 -4 -4 -2 -3 -4 -2 0 -2 -3 -3 -4 -1 -2 -2 + -5 H -2 0 1 -1 -3 1 0 -2 10 -4 -3 0 -1 -1 -2 -1 -2 -3 2 -4 0 0 -1 + -5 I -1 -4 -3 -4 -2 -3 -4 -4 -4 5 2 -3 2 0 -3 -3 -1 -3 -1 4 -4 -3 -1 + -5 L -2 -3 -4 -4 -2 -2 -3 -4 -3 2 5 -3 3 1 -4 -3 -1 -2 -1 1 -4 -3 -1 + -5 K -1 3 0 -1 -3 2 1 -2 0 -3 -3 6 -2 -4 -1 0 -1 -3 -2 -3 0 1 -1 + -5 M -1 -2 -2 -4 -2 0 -2 -3 -1 2 3 -2 7 0 -3 -2 -1 -1 0 1 -3 -1 -1 + -5 F -3 -3 -4 -5 -2 -4 -3 -4 -1 0 1 -4 0 8 -4 -3 -2 1 4 -1 -4 -4 -2 + -5 P -1 -3 -2 -1 -4 -1 -1 -2 -2 -3 -4 -1 -3 -4 10 -1 -1 -4 -3 -3 -2 -1 -2 + -5 S 1 -1 1 0 -1 0 -1 0 -1 -3 -3 0 -2 -3 -1 5 2 -4 -2 -2 0 0 -1 + -5 T 0 -1 0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1 2 5 -3 -2 0 0 -1 0 + -5 W -3 -3 -4 -5 -5 -1 -3 -3 -3 -3 -2 -3 -1 1 -4 -4 -3 15 2 -3 -5 -2 -3 + -5 Y -2 -1 -2 -3 -3 -1 -2 -3 2 -1 -1 -2 0 4 -3 -2 -2 2 8 -1 -3 -2 -1 + -5 V 0 -3 -3 -4 -1 -3 -3 -4 -4 4 1 -3 1 -1 -3 -2 0 -3 -1 5 -4 -3 -1 + -5 B -2 -1 4 5 -3 0 1 -1 0 -4 -4 0 -3 -4 -2 0 0 -5 -3 -4 5 2 -1 + -5 Z -1 0 0 1 -3 4 5 -2 0 -3 -3 1 -1 -4 -1 0 -1 -2 -2 -3 2 5 -1 + -5 X -1 -1 -1 -1 -2 -1 -1 -2 -1 -1 -1 -1 -1 -2 -2 -1 0 -3 -1 -1 -1 -1 -1 + -5 * -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 + 1 I wrote this so far.. my @aminos=qw(A R N D C Q E G H I L K M F P S T W Y + V B Z X); foreach my $key (sort keys %$A){ print $key." "x2; foreach my $key2 (sort keys %{$A->{$key}}){ printf("%.2f ", $A->{$key}->{$key2}); } } print "\n"x10; }

Replies are listed 'Best First'.
Re: printf matrix
by kcott (Archbishop) on Jan 06, 2014 at 13:56 UTC

    G'day madM,

    There's a whole series of problems with your post:

    • We don't need to see hundreds of data items (you've posted over 500 here); just post sufficient to support whatever issue you're describing.
    • You don't show your input data structure (presumably a hashref with the meaningless name $A).
    • You don't show the output you want.
    • You don't tell us what part of the code you're having difficulties with.
    • You show an @aminos array but don't use it in your code.
    • Your printf format suggests floating point data but all data shown are integers.
    • You've used the repetition operator (x) in two places that suggests you don't fully understand what this is for. It's explained in "perlop: Multiplicative Operators".

    Overall, it's very difficult to ascertain what exactly you need help with. Please read the guidelines in "How do I post a question effectively?" to find out how to compose a question that will help us to help you.

    As indicated by the printf documentation, you should look at sprintf for information on formats.

    Here's a best guess at what you're trying to achieve. If my guess is wrong (which is quite likely), it should at least provide some pointers for improving your code.

    #!/usr/bin/env perl use strict; use warnings; my %data = ( A => { A => 5, R => -2, N => -1 }, R => { A => -2, R => 7, N => -1 }, N => { A => -1, R => -1, N => 7 }, ); my @keys = sort keys %data; print ' '; printf "%4s" => $_ for @keys; print "\n"; for my $row (@keys) { print $row; printf "%4s" => $data{$row}{$_} for @keys; print "\n"; }

    Output:

    A N R A 5 -1 -2 N -1 7 -1 R -2 -1 7

    -- Ken

      thanks for your post ! i will look after the points you pointed out to post in the future in a better way .. happy new year !;)
Re: printf matrix
by Ratazong (Monsignor) on Jan 06, 2014 at 13:42 UTC

    Hi,

    I think the biggest problem in your solution is that all values are printed in one line. Instead you should start each $key in a new line. That way it would look more like a matrix, and you could improve the rest of your output.

    The easiest way to solve this would be to change your third line to

    print "\n$key ";
    HTH, Rata

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1069505]
Approved by marto
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (7)
As of 2024-03-28 11:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found