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

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

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

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

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

1 Ответ

25 голосов
/ 12 мая 2010

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

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

Использование () для индексации даст вам подмножество ячеек, тогда как {} вернет содержимое подмножества ячеек в виде списка, разделенного запятыми , и только первая запись этого списка будет помещена в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...