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
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
> =
> ======================================================================
>
_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl