为什么Matlab在运行if语句时没有读取空单元格?

时间:2013-07-10 20:10:15

标签: string matlab is-empty equivalence

我使用下面的循环来隔离记录数据的实例与没有数据的实例。数据集非常大(根据列不同,从1000-6000不等)和混合数据类型,因此我能想到的唯一实用的解决方案是使用循环。

我无法获得if或while语句来准确读取空格。如果我使用for循环,它运行没有任何错误,但它永远不会进入if的意义的前半部分,我最终复制,而不是分离我的数据。不同大小的数据会使for循环不受欢迎。

while (isempty(andover_all{j,1})==1) 
  if andover_all{h,33}==''; 
      current_data{k,4}= formated_date{j};  
      k=k+1;
  else
    current_data{i,1}=formated_date{j};
    current_data{i,2}=andover_data{33}(j);
    i=i+1;
 end
 h=h+1;
end

Andover_all是一个字符串数组,current_data和andover_data是具有混合数据类型的单元格数组。我尝试过使用isempty,[],cellfun(@ isempty和andover_data),以及一个允许我比较单元格元素的函数eq.m - 它们都不起作用。我也不想从数据中删除空单元格,只是跳过它们。

如果您有任何想法,请告诉我

1 个答案:

答案 0 :(得分:2)

空箱确实需要习惯。这就像使用infNaN一样; NaN==NaN1/0==inf之类的内容应该返回什么?对这些家伙有特殊规定。简单的,但你必须了解它们。为了使这些人的所有特殊规则更少负担,更直观和更易读,MATLAB为他们提供了特殊功能:isinf(检测inf),isnan(检测) NaN)和isfinite(检测 infNaN)。

空箱也有特殊行为和特殊规则,需要一些人习惯。如果你考虑一下,最后这一切都有意义:[]==[]应该返回什么?还是1==''

当然是空的。即使[]==false为空,[]false评估时也是if。容易吗? :)

不幸的是,没有相应的isinfisnan来检测特定类型的空白(没有 isemptycellisemptychar等等 相当于isfinite用于清空(isempty),它可以捕获 '',{{ 1}},或{}

但有时需要检查特定的清空,就像你的情况一样。空箱保留了他们的。这意味着,[]实际上是一个单元格,{}实际上是[] s的数组。

因此,要检测空单元格:

double

检测空字符串:

>> a = {};
>> iscell(a) && isempty(a)
ans = 
    1

并检测空数组:

>> a = '';
>> ischar(a) && isempty(a)
ans = 
    1