如果MATLAB函数返回可变数量的值,我怎样才能将它们全部作为单元格数组?

pri*_*ing 11 matlab function

我正在编写一个函数来从单元格数组中删除一些值,如下所示:

function left = remove(cells, item);
left = cells{cellfun(@(i) ~isequal(item, i), cells)};
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,left只有第一个值,因为使用逻辑数组调用cells {}会将所有匹配的单元格作为单独的值返回.如何将这些单独的返回值分组到单个单元格数组中?

此外,也许已经有办法从单元格数组中删除给定的项目?我在文档中找不到它.

gno*_*ice 25

您必须使用()而不是{}索引单元格:

function left = remove(cells, item)
  left = cells(cellfun(@(i) ~isequal(item, i), cells));
Run Code Online (Sandbox Code Playgroud)

使用()索引将为您提供单元格的子集,而using {}将返回单元格子集的内容作为逗号分隔列表,并且只有该列表的第一个条目将放在left您的示例中.

您可以查看此MATLAB文档以获取有关使用单元阵列的更多信息.


编辑:回复评论...

如果您的操作最终为您提供逗号分隔列表,则可以通过用大括号括起操作将列表的各个元素放入单元格数组的单元格中.举个例子,你可以这样做:

left = {cells{cellfun(@(i) ~isequal(item, i), cells)}};
Run Code Online (Sandbox Code Playgroud)

内部花括号集创建一个逗号分隔的内容列表,cells它不等于item,然后外部集合将此列表收集到单元格数组中.当然,这将给出与仅使用括号进行索引相同的结果,在这种情况下这是更明智的方法.

如果你有一个函数返回多个输出参数,并且要收集这些多个值到一个单元阵列,那么它就会更加复杂一些.首先必须确定将获得多少输出参数,或者您可以使用函数NARGOUT来获取所有可能的输出:

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

然后,您可以通过执行以下操作将输出收集到1- by - nOutcell数组中outArgs:

[outArgs{1:nOut}] = some_fcn(...);
Run Code Online (Sandbox Code Playgroud)

应该注意的是,如果函数具有可变数量的输出参数,NARGOUT将返回负值,因此在这种情况下您必须为自己选择值.nOut