Я использую cellfun
для применения функции к каждой ячейке в массиве ячеек.
Я знаю, что я должен установить 'UniformOutput'
в false
всякий раз, когда функция возвращает нескалярные значения, так что выходы функции возвращаются инкапсулированными в массив ячеек.
В качестве примера возьмем следующий массив ячеек:
C1 = {[1 2 3], [4 5 6]};
C1
имеет две ячейки, и каждая ячейка содержит вектор из трех элементов:
C1 =
1×2 cell array
[1×3 double] [1×3 double]
Если я хочу добавить 1
к содержимому в каждой ячейке, я могу определить функцию @(x) x + 1
и применить ее с помощью cellfun
следующим образом:
C2 = cellfun(@(x) x + 1, C1, 'UniformOutput', false);
Это работает очень хорошо, но обратите внимание, что мне нужно убедиться, что 'UniformOutput'
установлен в false
, как я объяснял ранее, в противном случае выдается ошибка.
Однако, прочитав этот поток, я понял, что если я завершу функцию с помощью оператор построения ячейки ячейки {}
, как этот @(x) {x + 1}
, тогда мне не нужно устанавливать 'UniformOutput'
в false
.
Таким образом, следующая команда будет генерировать те же результаты, что и в C2
, без каких-либо ошибок:
C3 = cellfun(@(x) {x + 1}, C1);
В терминах макета кода я предпочитаю этот подход, поскольку он более компактный и менее подробный, чем первый, но я не уверен, что это всегда безопасно.
Таким образом, мой вопрос:
Можно ли всегда включать функцию {}
, чтобы избежать установки 'UniformOutput'
на false
? Или существуют ли сценарии, в которых такая замена не будет работать?
Мои исследования:
help cellfun
'UniformOutput'
- логическое значение, указывающее, выводFUN
может быть возвращен без инкапсуляции в ячейку массив. Еслиtrue
(по умолчанию),FUN
должен возвращать скалярные значения, которые могут быть объединены в массив. Еслиtrue
, выходы должны быть следующие типы: числовые, логические, char, struct, cell. Еслиfalse
,cellfun
возвращает массив ячеек (или несколько массивов ячеек), где (I, J,...) -я ячейка содержит значение FUN (C {I, J,...},...). Если'UniformOutput'
false
, выходы могут быть любого типа.
Следующий фрагмент является частью ответа на соответствующий вопрос:
[...]
cellfun
выполняет операцию разыменования, которая требуется выполнять подробные операции над отдельными элементами ячейки при циклировании (т.е.{}
) [...]