Cell Array的逻辑测试

时间:2016-03-18 16:08:02

标签: matlab cell-array

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

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

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

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

由于

巴兹

1 个答案:

答案 0 :(得分:3)

如果单元数组元素是数字数组,则同样的概念也适用。

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

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

另一种方法是构造一些表达式,当你的条件为真时,返回一个数组,其中有NaNs,其他地方则是原始值。

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

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

这将导致每个元素在条件为真时乘以0/0NaN)并在条件为假时乘以1/1(1)。这样,满足条件的所有值都将设置为NaN。

如果我们在您的示例数据上尝试此操作:

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循环来做这种事情真的没有羞耻,因为它可能比这里的解决方案更有效。