Если функция MATLAB возвращает переменное число значений, как я могу получить все из них в качестве массива ячеек?

Я пишу функцию для удаления некоторых значений из массива ячеек, например:

function left = remove(cells, item);
left = cells{cellfun(@(i) ~isequal(item, i), cells)};

Но когда я запускаю это, left имеет только первое значение, так как вызов ячеек {} с логическим массивом возвращает все соответствующие ячейки в виде отдельных значений. Как объединить эти отдельные возвращаемые значения в один массив ячеек?

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

Ответ 1

Вам нужно использовать () вместо {} для индексации ячеек:

function left = remove(cells, item)
  left = cells(cellfun(@(i) ~isequal(item, i), cells));

Использование () для индексирования даст вам подмножество ячеек, а использование {} вернет содержимое подмножества ячеек как comma- разделенный список, и только первая запись этого списка будет помещена в left в вашем примере.

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


РЕДАКТИРОВАТЬ: Ответ на комментарий...

Если у вас есть операция, которая дает вам список, разделенный запятыми, вы можете поместить отдельные элементы списка в ячейки массива ячеек, окружив операцию фигурными фигурными скобками. Для вашего примера вы можете сделать:

left = {cells{cellfun(@(i) ~isequal(item, i), cells)}};

Внутренний набор фигурных скобок создает разделенный запятыми список содержимого cells, который не равен item, а внешний набор затем собирает этот список в массив ячеек. Это, конечно же, даст тот же результат, что и использование круглых скобок для индексации, что является более разумным подходом в этом случае.

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

nOut = 3;                   %# Get the first three output arguments
%# Or...
nOut = nargout(@some_fcn);  %# Get all the output arguments from some_fcn

Затем вы можете собирать выходы в массив ячеек 1-by- nOut outArgs, выполняя следующие действия:

[outArgs{1:nOut}] = some_fcn(...);

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