Re: multiple outputs from compiled function
- To: mathgroup at smc.vnet.net
- Subject: [mg114319] Re: multiple outputs from compiled function
- From: "Eric Michielssen" <emichiel at eecs.umich.edu>
- Date: Wed, 1 Dec 2010 02:09:49 -0500 (EST)
Thanks for the suggestion. I was thinking more about a routine that populates a huge sparse matrix, say for finite element analysis. SparseArray does not work within Compile, and that's understandable. So the next best thing would be to have a compiled function generate a long list of positions ( pos = {pos1,pos2,pos3...} with posi = {n1,n2} ) and a list of values ( val = {val1,val2,val3,...} ), and then construct the SparseArray externally to a compiled function. But how do I get my compiled function to return both pos and val? Upon reaching Return[{pos,val}], Mathematica reverts to the noncompiled function, in essence starting over from scratch. (I can only think of a few not so elegant solutions, none of which would apply in situations more complex than the above). Eric -----Original Message----- From: Oliver Ruebenkoenig [mailto:ruebenko at wolfram.com] Sent: Tuesday, November 30, 2010 6:24 AM To: mathgroup at smc.vnet.net Subject: [mg114319] [mg114315] Re: multiple outputs from compiled function 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