Si quiero encontrar todas las cantidades posibles a partir de dos listas list1
y list2
, utilizo la función Outer[]
con la especificación de Plus
como el operador de la combinación de:En Mathematica, ¿cómo compilo la función Externa [] para un número arbitrario de argumentos?
In[1]= list1 = {a, b}; list2 = {c, d}; Outer[Plus, list1, list2]
Out[1]= {{a + c, a + d}, {b + c, b + d}}
si quiero ser capaz de manejar un número arbitrario de listas, por ejemplo, una lista de listas,
In[2]= listOfLists={list1, list2};
entonces la única manera que sé cómo encontrar todas las sumas posibles es utilizar la función Apply[]
(que tiene la mano corta @@
) junto con Join
:
In[3]= argumentsToPass=Join[{Plus},listOfLists]
Out[3]= {Plus, {a, b}, {c, d}}
In[4]= Outer @@ argumentsToPass
Out[4]= {{a + c, a + d}, {b + c, b + d}}
o simplemente
In[5]= Outer @@ Join[{Plus},listOfLists]
Out[5]= {{a + c, a + d}, {b + c, b + d}}
El problema viene cuando intento compilar:
In[6]= Compile[ ..... Outer @@ Join[{Plus},listOfLists] .... ]
Compile::cpapot: "Compilation of [email protected]@Join[{Plus},listOfLists]] is not supported for the function argument Outer. The only function arguments supported are Times, Plus, or List. Evaluation will use the uncompiled function. "
La cuestión es que am usando un s función upported, es decir, Plus
. El problema parece ser únicamente con la función Apply[]
. Porque si le dan un número fijo de listas al exterior de más juntos, funciona bien
In[7]= Compile[{{bob, _Integer, 1}, {joe, _Integer, 1}}, Outer[Plus, bob, joe]]
Out[7]= CompiledFunction[{bob, joe}, Outer[Plus, bob, joe],-CompiledCode-]
pero tan pronto como yo uso Apply
, se rompe
In[8]= Compile[{{bob, _Integer, 1}, {joe, _Integer, 1}}, Outer @@ Join[{Plus}, {bob, joe}]]
Out[8]= Compile::cpapot: "Compilation of [email protected]@Join[{Plus},{bob,joe}] is not supported for the function argument Outer. The only function arguments supported are Times, Plus, or List. Evaluation will use the uncompiled function."
Así que mis preguntas son: ¿Hay alguna forma de eludir este error o, alternativamente, una forma de calcular todas las sumas posibles de elementos extraídos de un número arbitrario de listas en una función compilada?
(Además, no estoy seguro de si "compilación" es una etiqueta adecuada. Por favor avise.)
Muchas gracias.
¿Cuántas listas espera y por cuánto tiempo son las listas? Según la respuesta, Compilar puede no ser la forma más rápida de realizar esta operación. – joebolte