元胞数组的逻辑测试

Logical tests on Cell Arrays

在 Matlab 中处理常规数组时,很容易执行逻辑测试并将未通过这些测试的单元格设置为所需值(例如 NaN),而无需使用 for 循环。

TestA=[1 2 10 45];
TestA(TestA<=2)=NaN;

我有一个元胞数组,我可以在其中进行逻辑测试,但我如何在不使用 for 循环的情况下将未通过测试的元胞数组元素转换为 NaN?

TestCell{1}=[1 2 10 45];
TA=TestCell{1} <= 2;

谢谢

巴兹

如果元胞数组元素是数值数组,则相同的概念也适用。

TestCell{1}(TestCell{1} <= 2) = NaN;

现在如果你想在没有显式 for 循环的情况下遍历 所有 单元格的元素,这有点困难,因为你不能在 cellfun

另一种方法是构造一些表达式,它将 return 一个数组,当您的条件为真时,其中有 NaN,而原始值在其他地方。

这样的表达式可能如下所示:

x .* ~(x <= 2) ./ ~(x <= 2);

这将导致每个元素在条件为真时乘以0/0NaN),在条件为假时乘以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 循环来做这种事情真的没有什么可耻的,因为它可能比这里的解决方案更高效。