我正在使用 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
,否则会抛出错误。
然而,在阅读this thread后,我意识到如果我像这样使用cell array construction operator {}
包装函数@(x) {x + 1}
,那么我就不需要将'UniformOutput'
设置为false
了。
因此,以下命令将生成与C2
中相同的结果,而不会引发任何错误:
C3 = cellfun(@(x) {x + 1}, C1);
在代码布局方面,我更喜欢这种方法,因为它比以前的方法更紧凑,更简洁,但我不确定这是否总是安全的。
因此我的问题是:
我是否总是可以用
{}
来包装函数,以避免设置'UniformOutput'
为false
?或者有任何情况下这种替换不起作用吗?
我的研究:
help cellfun
'UniformOutput'
-- 一个逻辑值,指示是否可以在不封装到单元格数组中的情况下返回FUN
的输出。如果为true
(默认值),则FUN
必须返回可连接成数组的标量值。如果为true
,则输出必须为以下类型:数字、逻辑、字符、结构体、单元格。如果为false
,cellfun
将返回一个单元格数组(或多个单元格数组),其中(I,J,...)th单元格包含值FUN(C{I,J,...}, ...)。当'UniformOutput'
为false
时,输出可以是任何类型。
以下片段是相关问题的答案的一部分:
[...]
cellfun
负责解除引用操作,该操作在循环时需要对单个单元格的各个元素进行详细操作(即{}
)[...]
cellfun
捕获多个输出甚至是可能的。这是一个启发性的答案!谢谢 :) - codeaviator