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

Reply via email to