如果元胞数组元素是数值数组,同样的概念也适用。
TestCell{1}(TestCell{1} <= 2) = NaN;
现在,如果您想在没有显式 for 循环的情况下遍历单元格的 所有 元素,这有点困难,因为您无法在 cellfun 内进行赋值。
另一种方法是构造一些表达式,当您的条件为真时,该表达式将返回一个数组,其中存在 NaN,其他地方的原始值。
这样的表达式可能如下所示:
x .* ~(x <= 2) ./ ~(x <= 2);
这将导致每个元素在条件为真时乘以0/0 (NaN),在条件为假时乘以1/1 (1)。这样,所有满足条件的值都会被设置为 NaNs。
如果我们在您的示例数据上尝试此操作:
x = [1 2 10 45];
x .* ~(x <= 2) ./ ~(x <= 2)
NaN NaN 10 45
我们得到你的条件为真的 NaN。所以现在我们可以将其插入cellfun 以对所有内容执行此操作。
output = cellfun(@(x)x .* ~(x <= 2)./~(x <= 2), TestCell, 'uni', 0);
另一种方法是将条件倒写,这样所有不符合条件的元素都将设置为NaN。这将避免必须否定上述等式中的两个条件。
x = [1 2 10 45]
x .* (x > 2) ./ (x > 2)
我们可以像上面那样将它插入cellfun。
output = cellfun(@(x)x .* (x > 2) ./ (x > 2), TestCell, 'uni', 0);
这种方法的主要缺点是它需要您评估条件两次,因为没有很好的方法将中间结果存储在cellfun 中。这可能是也可能不是问题,具体取决于每个元素的大小。有一个 for 循环来做这种事情真的没有什么可耻的,因为它可能比这里的解决方案性能更高。