2013-06-21 3 views
2

У меня есть функция f[d_]. Мое намерение - применить эту функцию к списку в целом. Скажите, d={1,2,3,...}, затем f[d] дает мне результат (число или что-то еще). До сих пор все ясно.Mathematica: Применение функции к списку списка

Теперь давайте говорить у меня есть следующий список списков: p={l1,l2,l3,...} Есть более эффективный способ, чем карты, чтобы вычислить f[p], где ожидаемый результат {f[l1],f[l2],f[l3],...}?

Например, с помощью функции Sin[x], сопоставление ее по списку происходит медленнее, чем просто поместить список внутри аргумента. Это, похоже, не работает с моей функцией f[d] и списком списков p. Что я должен сделать, чтобы сделать эту работу? Будет ли это быстрее, чем Карта?

Чтобы сделать себя яснее, скажем

f[d_]:=Total[d] 
Then, f[{a1,a2,a3}] gives me a1+a2+a3, as expected. 
But, f[{{a1, a2, a3}, {b1, b2, b3}, {c1, c2, c3, c4}}] kills the machine. 

Спасибо!

+0

Требуется ли Вам что-то вроде 'Total [{{a1, a2, a3}, {b1, b2, b3}, {c1, c2, c3, c4}}, {2}] '? – tomd

+0

попробуйте использовать атрибут listable: 'SetAttribbutes [f, Listable]' – agentp

ответ

1

Когда я изменить свой код, это дает:

 Total[{{a1, b1, c1}, {b1, b2, b3}, {c1, c2, c3}}] 
    {a1 + b1 + c1, b1 + b2 + c2, b3 + c1 + c3} 

Когда Total принять аргумент-список, это просто добавить пользователей, в вашем случае, это добавляет

{a1, b1, c1},{b1, b2, b3}, {c1, c2, c3} 

Но они не являются то же измерение, поэтому вы не можете получить правильный ответ.

В этом случае следует использовать карту.

Map[Total,{{a1, b1, c1}, {b1, b2, b3}, {c1, c2, c3, c4}}] 

или

Plus @@@ {{a1, b1, c1}, {b1, b2, b3}, {c1, c2, c3, c4}} 
+0

Спасибо за вашу помощь – Ivan

0

К сожалению неперечислимо не делает работу здесь .. Вы можете поместить карту внутри функции, если это помогает ..

ClearAll[f] 
f[d_List] := Map[ Total, d, {-2}] 
f[{1, 2, 3}] 
f[{{1, 2, 3}, {4, 5}}] 
f[{{{1, 2, 3}, {4, 5}}, {{6}, {7, 8}}}] 

(* 6 *) 
(* {6, 9} *) 
(* {{6, 9}, {6, 15}} *)