in reply to Re: Unfolding a nDeep structure
in thread Unfolding a nDeep structure

Thank you blockhead, I've been playing a bit with Dive. This would be part of a script were data is fed to @MDAsomeIndex in the form +1. I do not not have it behaving this way:
#!/usr/bin/perl -w use strict; use Data::Diver qw[Dive DiveVal]; use Algorithm::Loops 'NestedLoops'; my @MDA; my $dimension = 3; my $depth = 2; NestedLoops( [ ( [0..$dimension-1] ) x $depth ], sub { DiveVal( \@MDA, @_ ) = 0; } ); $MDA[0][0] += 1; my @AoA; for my $level (0..$dimension-1) { NestedLoops( [ ( [0..$dimension-1] ) x ($depth-1) ], sub { my @indices = @_; my $val = Dive( \@MDA, @indices ); push @{$AoA[$level]}, @$val; } );} for my $row (0..$#AoA) { print "@{$AoA[$row]}\n"; }
Prints:
1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0

Updated: Expected:
1 0 0
0 0 0
0 0 0

???

Replies are listed 'Best First'.
Re^3: Unfolding a nDeep structure
by blokhead (Monsignor) on Jul 05, 2007 at 23:13 UTC
    If I understand right (from looking at your example code in the OP), you want a structure that looks like this:
    @AoA = ( [ $MDA[0][0][0], $MDA[0][0][1], ... , $MDA[0][2][2] ], [ $MDA[1][0][0], $MDA[1][0][1], ... , $MDA[1][2][2] ], [ $MDA[2][0][0], $MDA[2][0][1], ... , $MDA[2][2][2] ], );
    In other words, $AoA[x] contains all the elements of the form $MDA[x][*][*], if you follow my notation.

    I don't see how this corresponds with your "Expected" data, but one thing I noticed is that you should make the following change:

    # my $val = Dive( \@MDA, @indices ); # push @{$AoA[$level]}, @$val; my $val = Dive( $MDA[$level], @indices ); push @{$AoA[$level]}, $val;
    Because when dealing with $AoA[$level], you only care about things starting form $MDA[$level]. Also, then $val will not be an arrayref like it was before.

    There are many equivalent ways to write this, but another way is the following: Here you can replace the entire foreach loop with this:

    NestedLoops( [ ( [0..$dimension-1] ) x ($depth-1) ], sub { my @indices = @_; my $val = Dive( \@MDA, @indices ); push @{ $AoA[$indices[0]] }, $val; } );
    To explain this, it takes everything of the form $MDA[a][b][c] and pushes it onto the array at $AoA[a].

    blokhead