在Matlab中处理常规数组时,很容易执行逻辑测试并将未通过这些测试的单元格设置为所需的值,例如NaN,而不必使用for循环。
TestA=[1 2 10 45];
TestA(TestA<=2)=NaN;
我有一个单元格数组,我可以在那里进行逻辑测试,但是如何在不使用for循环的情况下将未通过测试的单元数组元素转换为NaN?
TestCell{1}=[1 2 10 45];
TA=TestCell{1} <= 2;
由于
巴兹
答案 0 :(得分:3)
如果单元数组元素是数字数组,则同样的概念也适用。
TestCell{1}(TestCell{1} <= 2) = NaN;
现在,如果你想在没有显式for循环的情况下循环遍历单元格元素的所有,这有点困难,因为你不能在cellfun
内做任务。
另一种方法是构造一些表达式,当你的条件为真时,返回一个数组,其中有NaNs,其他地方则是原始值。
这样的表达式可能如下所示:
x .* ~(x <= 2) ./ ~(x <= 2);
这将导致每个元素在条件为真时乘以0/0
(NaN
)并在条件为假时乘以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循环来做这种事情真的没有羞耻,因为它可能比这里的解决方案更有效。