2013-07-10 18 views
1

我正在使用下面的循環來隔離記錄數據的實例與沒有數據的實例。數據集非常大(根據列的不同而不同,從1000-6000不等)以及混合數據類型,所以我能想到的唯一實際解決方案是使用循環。爲什麼Matlab在運行if語句時沒有讀取空單元?

我無法獲得if或while語句以準確讀取空格。它運行時沒有任何錯誤,如果我使用for循環,但它永遠不會進入if-meaning的前半部分,最終會複製,而不會分離我的數據。數據的大小變化使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,它們允許我比較單元格元素 - 它們都不起作用。我也不想從數據中刪除空單元格,只是略過它們。

請讓我知道如果您有任何意見

回答

2

空的物品確實是一些習慣。這就像使用infNaN; NaN==NaN1/0==inf應該返回什麼?這些人有特殊的規定。簡單的,但你必須瞭解它們。爲了使所有這些人的負擔較小的特殊規則,更直觀,更可讀,MATLAB對其有特殊的功能:isinf(檢測inf),isnan(檢測NAN)和isfinite(檢測要麼infNaN)。

容器也有特殊的行爲和特殊的規則,需要一些習慣。如果你仔細想想,最後一切都有意義:[]==[]應該返回什麼?或1==''

當然是空的。即使[]==false爲空,當由if進行評估時,[]false。容易嗎? :)

不幸的是,沒有任何等效的isinfisnan來檢測特定類型的清空(沒有沒有isemptycellisemptychar等)有isfinite爲清空的等效(這是isempty) ,其捕獲或者'',{}[]

但有時需要檢查特定的空容器,就像你的情況一樣。容器保留類別。這意味着,{}確實是一個單元格,而[]確實是一個double的數組。

因此,檢測空單元:

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

檢測空字符串:

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

和檢測空數組:

>> a = []; 
>> isnumeric(a) && isempty(a) 
ans = 
    1 
相關問題