On 8/31/2011 7:50 PM, Joel Berger wrote:
Do you need 'sever's in there to break the dataflow
connections?
--Chris
I thought maybe you would be left with dangling
refs to piddles which would prevent the memory
being freed.
It seems to work as-is, what would sever do to help? What I think I am
doing is unrolling each dimension of the piddle until it is a "vector"
and then using list to create an arrayref which then is passed back up
the recursion chain. It doesn't seem to me that even if the original
input were a slice or if there is some memory retained in the dog
process (is there?) that my concept wouldn't work. Though I am no
expert by any means.
I take it by your response that there is no built-in that does this
then however.
Not that I know of but it could be a useful addition for
folks interoperating between PDL and other perl data processing
modules.
Are you looking for the list function? See
pdl.perl.org/?docs=Core&title=PDL::Core#list
David
I actually use the list function in my implementation of unroll. The
problem I had, (and I think I was using it correctly) was that it
flattened the piddle as it returned the list so that an NxN array
became a 1x(N+N) vector. Unroll makes an array reference of N array
references each of length N.
--------------------
The reasoning is that my module Math::GSLx::ODEIV2 doesn't use PDL for
data storage, but I want it to be able to if PDL is present. When the
module is compiled the functionality is obvious, an AoA is returned.
If compiled with PDL however, internally during the calculation the
data would be in a PDL (so that there is the option of returning a
piddle and I don't need to create so many SV*s), however this presents
a problem if the user expects the function to return an AoA. Therefore
a PDL=>1 option would return a piddle, but otherwise I need to unroll
the piddle into an AoA.
Perhaps this seems crazy and perhaps it is crazy, but I think it should work.
Looks good to me. I was wondering if it would be simpler to
go from the GSL data type to pdls rather than via the expansion
to a perl array.
--Chris
Joel
On Wed, Aug 31, 2011 at 2:34 PM, Joel Berger<[email protected]> wrote:
For not just purely academic reasons, I am wondering if there is a
better/builtin way of converting a PDL of arbitrary size into its pure
perl equivalent. (call it the inverse of the pdl() function). Here's
what I came up with, is there something better or can someone be more
clever?
#!/usr/bin/env perl
use strict;
use warnings;
use PDL;
use Test::More tests => 1;
my $array = [
[[1,2],
[3,4]],
[[5,6],
[7,8]],
[[9,10],
[11,12]]
];
my $pdl = pdl $array;
is_deeply( unroll($pdl), $array, "back convert 3d");
sub unroll {
my $in = shift;
if (ref $in and ref $in eq 'PDL') {
if ($in->ndims> 1) {
return [ map {unroll($_)} dog $in ];
} else {
return [list $in];
}
} else {
return $in;
}
}
_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
-----
No virus found in this message.
Checked by AVG - www.avg.com
Version: 10.0.1392 / Virus Database: 1520/3868 - Release Date: 08/30/11
_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl