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

Hello again, I have built a matrix of say 5 X 5, and I would like to have the ability to reference any col and row I choose (ie. $matrix_ref->[5][3]=$foo) this is what i have for code:
my $matrix_ref; for(0..$length2 { for(0..$length1) { @test = populate($length1); $matrix_ref->[$row][$col] = \@test; } } for(0..$length2) { print "["; for(0..$length1) { print "$matrix_ref->[$row][$col][$_] "; } print "] \n\n"; } } sub populate { my $elements = shift; my @ary; push @ary, $matrix[$element]; $element ++; return @ary; }
What is the best way to access a specific location in the array to make changes, and/or check a value?

Thanks for the help

Edit Masem 2002-03-01 - CODE tags

Replies are listed 'Best First'.
Re: Matrix Reference
by jmcnamara (Monsignor) on Mar 01, 2002 at 14:55 UTC

    If you are specifically interested in matrices have a look at Math::MatrixReal and in particular the assign() method. This will also take care of the pretty-printing.

    This is a neat module. From the pod (but not directly related to the question):

    $matrix = Math::MatrixReal->new_from_string(<<'MATRIX'); [ 1 0 0 0 0 0 1 ] [ 0 1 0 0 0 0 0 ] [ 0 0 1 0 0 0 0 ] [ 0 0 0 1 0 0 0 ] [ 0 0 0 0 1 0 0 ] [ 0 0 0 0 0 1 0 ] [ 1 0 0 0 0 0 -1 ] MATRIX

    If on the other hand you just want to deal with a 2-D array of data have a look a perllol.

    --
    John.

Re: Matrix Reference
by ton (Friar) on Mar 01, 2002 at 19:24 UTC
    I have to admit, I clicked on this node because I wanted to see a reference to "The Matrix", e.g. "There is no spoon." But now that I've looked at your code, I thought I'd give some feedback:

    1. use strict. Really. A lot of problems will become apparent if you do.
    2. In populate, you use $element without declaring it (you declare $elements.)
    3. In populate, you use $matrix without declaring it. So $matrix[$element] will always return 0.
    4. Within the main code, you continuously use $row and $col without ever changing them. So you are always indexing at 0, 0. (I assume $length1 and $length2 were initialized elsewhere, otherwise they too are always equal to 0).
    5. Even if $row and $col changed, setting $matrix_ref->[row][$col] to \@test is setting all elements to be a reference to the same array (@test). I'm pretty sure that's not what you want.
    Items 2, 3, and 4 would have been immediately obvious had you used strict.

    -Ton
    -----
    Be bloody, bold, and resolute; laugh to scorn
    The power of man...