Ответ 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
самостоятельно в этом случае.