Re: multiple outputs from compiled function
- To: mathgroup at smc.vnet.net
- Subject: [mg114315] Re: multiple outputs from compiled function
- From: Oliver Ruebenkoenig <ruebenko at wolfram.com>
- Date: Tue, 30 Nov 2010 06:23:49 -0500 (EST)
On Tue, 30 Nov 2010, Eric Michielssen wrote:
> I have a compiled function that internally generates 10 large lists (list1
> though list10), all of different ranks and sizes. Problem is that a compiled
> function can only return one packed array, so returning them to the main
> code is an issue. Of course, I could combine/pack all these lists into one
> list by Flatten[list1,...,list10], return the new structure, and then unpack
> it in the main code. Is there a less cumbersome way of doing this?
>
> Eric Michielssen
>
>
>
>
Eric,
Here are some thoughts:
It is correct that compile can only work with rectangular tensors. See the
following:
f = Compile[{{t1, _Real, 2}, {t2, _Real, 2}}, Join[t1, t2]]
f[RandomReal[{0, 1}, {2, 2}], RandomReal[{0, 1}, {2, 1}]]
compared to:
f[RandomReal[{0, 1}, {2, 2}], RandomReal[{0, 1}, {2, 2}]]
But if the result of the base CompiledFunction is a list, and the list
results come out different lengths, it returns a list of PackedArrays,
cf = Compile[{{x, _Real}, {n, _Integer}},
Module[{y = 1.}, Table[y = (y + x/y)/2, {n}]],
RuntimeAttributes -> Listable];
res = cf[{2., 3.}, {3, 2}]
{Developer`PackedArrayQ[res], Map[Developer`PackedArrayQ, res]}
resp = cf[{2., 3.}, 3]
Developer`PackedArrayQ[resp]
What do exactly in your case depends on the code.
Hope this helps,
Oliver