Что вы обычно делаете для написания составных функций в Mathematica - PullRequest
3 голосов
/ 31 декабря 2011

Если я хочу сделать следующее:

getCH[pts_List] := Module[{t}, t = ConvexHull[pts]; Map[Part[pts, #] &, t]];

или

Map[Function[{x}, Part[#, x]], ConvexHull[#]]&

Какие есть другие способы написать это? А как ты обычно делаешь для скорости и эффективности?

Редактировать

Кстати, я спрашиваю об этом в общих чертах, а не об этой конкретной проблеме. Иногда я чувствую недостаток умственных способностей, чтобы думать в терминах функционального программирования в мма Просто хочу расширить свой арсенал различными другими способами написания функциональных композиций и научиться анализировать их сложность / эффективность. Поэтому, пожалуйста, добавьте похожие проблемы.

Ответы [ 3 ]

4 голосов
/ 01 января 2012

Я не знаю, что такое ConvexHull, но я предполагаю, что понял проблему

    getCH[pts_]:=pts[[ConvexHull[pts]]]


    getCH[pts_]:=Extract[pts, Transpose@{ConvexHull[pts]}]

Если вы хотите, чтобы pts появлялся только один раз, по какой-то причине вы всегда можете использовать With, Module или Block,Я думаю, что наиболее важно сказать, что я не вижу смысла в этом.С, эффективно заменяет каждое появление очков списком очков.Похоже, это излишне, но вы можете написать

     getCH[pts_]:=With[{p=pts},p[[ConvexHull[p]]]]

Модуль создает новую переменную.Обычно это медленнее, чем с, для случаев, когда вашей переменной не нужно присваивать значение.Другими словами, С быстрее для определения констант.Блок, я думаю, также быстрее, чем Module (немного), но его динамическая область видимости (против лексической области видимости Module) делает его немного более странным.Множество потоков об этом.

Я не думаю, что есть какая-либо встроенная функция, которая берет список и функцию или символ и извлекает элементы из этого списка, проиндексированные в результате оценки функции на том же самомсписок, если это то, что вы искали для вашей "общей" проблемы.Конечно, вы можете легко создать его, а затем использовать в будущем.Я думаю, что это слишком много для такой простой проблемы, но, возможно, это функциональное программирование, к которому вы стремились

    ExtractIndexed[l_List, fun_]:=l[[fun[l]]]

    getCH[pts_]:=ExtractIndexed[pts, ConvexHull]
3 голосов
/ 31 декабря 2011

Вы можете инициализировать переменные в Module, как это

Module[{t = ConvexHull[pts]}, Map[Part[pts, #] &, t]]

Но в этом случае вы не переопределяете t, так что это локальная константа, и вам лучше использовать With.

With[{t = ConvexHull[pts]}, Map[Part[pts, #] &, t]]

Или просто

Map[Part[pts, #] &, ConvexHull[pts] ]

или

Part[pts, #] & /@ ConvexHull[pts]

С этим вопросом связано: Использование вложенных слотов . Не рекомендуется вкладывать чистые функции без именования переменных.

Вы могли бы «инвертировать» вашу функцию следующим образом, но я не могу гарантировать, что она работает.

Function[x,Part[#,x]]& /@ ConvexHull[#] & @ pts
1 голос
/ 31 декабря 2011

Возможно, попробуйте использовать Through:

Part @@ Through[ 
 List[ Identity, Graphics`Mesh`ConvexHull][{{0, 0}, {1, 0}, {.5, .5}, {1, 1}, {0, 1}}]
]

Этот выводит предупреждение (потому что Part оценивает), но затем «работает»:

Through[
 Part[Identity, Graphics`Mesh`ConvexHull][{{0, 0}, {1, 0}, {.5, .5}, {1, 1}, {0, 
 1}}]]

Я думаю, что это обходной путь Part, описанный выше:

Through[
 Unevaluated[
  Part[
   Identity, Graphics`Mesh`ConvexHull][
   {{0, 0}, {1, 0}, {.5, .5}, {1, 1}, {0, 1}}
]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...