On Mon, Jun 21, 2010 at 11:17 PM, Craig DeForest <[email protected]> wrote: > Argh, that's what I get for dashing something off on the way out the door. > The strategy is to create a PDL that is large enough to accommodate > everything, then to copy the subsidiary data into it one row at a time. The > reason to use range() is that it handles boundary conditions neatly, so you > can tell it to truncate. > > The bug is that I interchanged the pdl() and map{} constructs. I'm sorry to > have steered you down a wrong path. You want: > > $dims = cat( map { pdl($_->dims) } @p)->mv(-1,0)->maximum; > $pdl = PDL->new_from_specification(0...@p, $dims->list); > for my $i(0..$#p) { > $pdl->(($i)) .= $p[$i]->range(0*$dims, $dims, 't'); > } > $pdl = $pdl->mv(0,-1); # match cat() index placement >
Yup. That does the trick. Thank you so much for your help and your patience. Now I will spend the next 30 mins staring at your code and learning each bit of it step by step. > > > On Jun 21, 2010, at 10:04 PM, P Kishor wrote: > >> On Mon, Jun 21, 2010 at 9:26 PM, Craig DeForest >> <[email protected]> wrote: >>> >>> Try "PDL->new_from_specification". >> >> much better, in that, no more error from the above call. That said, >> the rest of the code doesn't really solve my problem. Here is my >> sample code >> >> # add four 4x5 piddles to @p >> push @p, sequence(4, 5) for (0 .. 3); >> >> # add a 3x5 piddle to @p. This is the piddle with wrong dims. >> # It should be 4x5 >> push @p, sequence(3, 5); >> >> # Craig's code suggestion hereon >> $dims = cat(pdl(map { $_->dims } @p))->mv(-1,0)->maximum; >> >> $pdl = PDL->new_from_specification(0...@p, $dims); >> >> for my $i (0 .. $#p) { >> $pdl->( ($i) ) .= $p[$i]->range(0 * $dims, $dims, 't'); >> } >> >> PDL: PDL::Ops::assgn(a,b): Parameter 'b' >> PDL: Mismatched implicit thread dimension 7: should be 4, is 5 >> >> Actually, the last piddle needs to become 4x5 >> >> >> >>> >>> (Mobile) >>> >>> >>> On Jun 21, 2010, at 6:27 PM, P Kishor <[email protected]> wrote: >>> >>>> On Mon, Jun 21, 2010 at 6:10 PM, Craig DeForest >>>> <[email protected]> wrote: >>>>> >>>>> Well, you have to copy every puddle anyway, to collate them as you >>>>> desire. >>>>> >>>> >>>> Ok. Then I need to understand your code first. Keep in mind, I am >>>> still in trainer-wheels. >>>> >>>> >>>> >>>> Hi, I think I am missing a lot here... here is test code I tried out >>>> >>>> # add four 4x5 piddles to @p >>>> push @p, sequence(4, 5) for (0 .. 3); >>>> >>>> # add a 3x5 piddle to @p. This is the "wrong" piddle. It really should >>>> be >>>> 4x5 >>>> push @p, sequence(3, 5); >>>> >>>> $dims = cat(pdl(map { $_->dims } @p))->mv(-1,0)->maximum; >>>> print $dims; >>>> >>>> # Prints >>>> # [4 5 4 5 4 5 4 5 3 5] >>>> >>>> $pdl = new_from_specification(0...@p, $dims); >>>> >>>> # Error: Undefined subroutine &main::new_from_specification called >>>> >>>> # I change the above line to >>>> $pdl = PDL::new_from_specification(0...@p, $dims); >>>> >>>> # Now I get the following error >>>> # Error: File Core.pm; Line 1789: Can't call method "initialize" without >>>> a >>>> # package or object reference <DATA> line 206 >>>> >>>> =for >>>> >>>> 1772 sub PDL::new_from_specification{ >>>> 1773 my $class = shift; >>>> 1774 my $type = ref($_[0]) eq 'PDL::Type' ? ${shift @_}[0] : >>>> $PDL_D; >>>> 1775 my $nelems = 1; my @dims; >>>> 1776 for (@_) { >>>> 1777 if (ref $_) { >>>> 1778 barf "Trying to use non-piddle as dimensions?" unless >>>> $_->isa('PDL'); >>>> 1779 barf "Trying to use multi-dim piddle as dimensions?" >>>> 1780 if $_->getndims > 1; >>>> 1781 warn "creating > 10 dim piddle (piddle arg)!" >>>> 1782 if $_->nelem > 10; >>>> 1783 for my $dim ($_->list) {$nelems *= $dim; push @dims, $dim} >>>> 1784 } else { >>>> 1785 barf "Dimensions must be positive" if $_<=0; >>>> 1786 $nelems *= $_; push @dims, $_ >>>> 1787 } >>>> 1788 } >>>> 1789 my $pdl = $class->initialize(); >>>> 1790 $pdl->set_datatype($type); >>>> 1791 $pdl->setdims([...@dims]); >>>> 1792 print "Dims: ",(join ',',@dims)," DLen: ",(length $ >>>> {$pdl->get_dataref}),"\n" if $PDL::debug; >>>> 1793 return $pdl; >>>> 1794 } >>>> >>>> =cut >>>> >>>> for my $i (0 .. $#p) { >>>> $pdl->( ($i) ) .= $p[$i]->range(0 * $dims, $dims, 't'); >>>> } >>>> >>>> I haven't reached this far, but if I do, what am I going to get? Is >>>> $pdl going to be the new list of piddles (with the correct piddle). I >>>> am guessing @p is going to be the new list, with the piddle at $p[4] >>>> corrected. And, what are its dims going to be? I want the 3x5 piddle >>>> to become 4x5 piddle. >>>> >>> >> >> >> >> -- >> Puneet Kishor http://www.punkish.org >> Carbon Model http://carbonmodel.org >> Charter Member, Open Source Geospatial Foundation http://www.osgeo.org >> Science Commons Fellow, http://sciencecommons.org/about/whoweare/kishor >> Nelson Institute, UW-Madison http://www.nelson.wisc.edu >> ----------------------------------------------------------------------- >> Assertions are politics; backing up assertions with evidence is science >> ======================================================================= >> > > -- Puneet Kishor http://www.punkish.org Carbon Model http://carbonmodel.org Charter Member, Open Source Geospatial Foundation http://www.osgeo.org Science Commons Fellow, http://sciencecommons.org/about/whoweare/kishor Nelson Institute, UW-Madison http://www.nelson.wisc.edu ----------------------------------------------------------------------- Assertions are politics; backing up assertions with evidence is science ======================================================================= _______________________________________________ Perldl mailing list [email protected] http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
