1

以下のループを使用して、データが記録されたインスタンスとデータのないインスタンスを分離しています。データ セットは非常に大きく (列によって 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 を使用してみましたが、どれも機能しません。また、データから空のセルを削除したくありません。スキップするだけです。

何かアイデアがあれば教えてください

4

1 に答える 1

2

空は確かに慣れるものです。inforで作業するようなものNaNです。物事は何を好むNaN==NaNか、何を1/0==inf返す必要がありますか? これらの人には特別なルールがあります。簡単なものですが、それらを知る必要があります。これらの人たちのすべての特別なルールを負担を軽減し、より直感的で読みやすくするために、MATLAB には特別な関数があります: isinf(を検出するinf)、isnan(NaN を検出する)、およびisfinite(または を検出する inf) NaN

エンプティには、慣れが必要な特別な動作と特別なルールもあります。考えてみれば、最終的にはすべてが理にかなっています。何を[]==[]返す必要があるのでしょうか。または1==''

もちろん、空です。[]==falseが空であっても、[]によってfalse評価されるとifです。簡単でしょ?:)

残念ながら、特定のタイプのエンプティを検出するisinforに相当するものありません(またははありませ) 。isnan isemptycellisemptycharisfiniteisempty ''{}[]

しかし、あなたの場合のように、特定の空をチェックすることが望ましい場合があります。空はそのクラスを保持します。これは、{}が実際にはセルであり、[]実際には の配列であることを意味しdoubleます。

したがって、空のセルを検出するには:

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

空の文字列を検出するには:

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

空の配列を検出するには:

>> a = [];
>> isnumeric(a) && isempty(a)
ans = 
    1
于 2013-07-10T20:29:59.127 に答える