Если я хочу найти все возможные суммы из двух списков list1
и list2
, я использую функцию Outer[]
со спецификацией Plus
в качестве оператора объединения:
In[1]= list1 = {a, b}; list2 = {c, d}; Outer[Plus, list1, list2]
Out[1]= {{a + c, a + d}, {b + c, b + d}}
Если я хочу обрабатывать произвольное количество списков, скажем, список списков,
In[2]= listOfLists={list1, list2};
тогда единственный способ узнать все возможные суммы - использовать функцию Apply[]
(которая имеет сокращенную комбинацию @@
) вместе с 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}}
или просто
In[5]= Outer @@ Join[{Plus},listOfLists]
Out[5]= {{a + c, a + d}, {b + c, b + d}}
Проблема возникает, когда я пытаюсь скомпилировать:
In[6]= Compile[ ..... Outer @@ Join[{Plus},listOfLists] .... ]
Compile::cpapot: "Compilation of Outer@@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. "
Дело в том, что я использую поддерживаемую функцию, а именно Plus
. Проблема, похоже, связана только с функцией Apply[]
. Потому что, если я дам ему фиксированное количество списков вместе с external-plus, он будет работать нормально
In[7]= Compile[{{bob, _Integer, 1}, {joe, _Integer, 1}}, Outer[Plus, bob, joe]]
Out[7]= CompiledFunction[{bob, joe}, Outer[Plus, bob, joe],-CompiledCode-]
но как только я использую Apply
, он ломается
In[8]= Compile[{{bob, _Integer, 1}, {joe, _Integer, 1}}, Outer @@ Join[{Plus}, {bob, joe}]]
Out[8]= Compile::cpapot: "Compilation of Outer@@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."
Итак, мои вопросы : есть ли способ обойти эту ошибку или, альтернативно, способ вычислить все возможные суммы элементов, извлеченных из произвольного числа списков в скомпилированной функции?
(Кроме того, я не уверен, является ли тег "compilation" подходящим. Пожалуйста, сообщите.)
Большое спасибо.