2016-04-13 36 views
1

私はおよそ200,000の長さの2つのベクトルを持っています。それらはdatenum形式の日付で構成されています。find returns empty matrix

%datenums 
date_exp = datenum(data_exp(:,1:6)); 
date_sim = datenum(data_sim(:,1:6)); 
  1. 私はdate_simに存在するDATE_EXPの日付を見つけたいです。長方形の空のマトリックスとの不適切な割り当て:

  2. そしてIは内容isMemberツールが、私は38検索retunrsを=で終わる使用しているDATE_EXP

から値を削除します。フィルタに

エラー(線18)
C(I)=(内容isMember(date_sim(:)、DATE_EXP(i))を見つけ、1)。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
c = zeros(length(date_sim),1); 

for i=1:length(date_sim) 

c(i)= find(ismember(date_sim(:),date_exp(i)),1); 

    if isempty(c(i)) == 1 
    c(i) = 0; 
    end 
end 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

誰もがここで私を助けることができれば、私は本当に参考になります。

+1

'find'が空の行列を返す場合は、真の値がないことを意味します。 'date_exp(38)'は 'date_sim'にありません。また、 'find'の代わりに' [〜、c(i)] = ismember(date_exp(i)、date_sim); ' – Suever

答えて

0

date_exp(38)は、date_simの範囲内にあってはならないという問題があります。入力に1がない場合、findは空の配列([])を返します。

この行のために、あなたのコードではこれを処理しません。

この場合
c(i) = find(...) 

、何の一致(find() == [])が存在しない場合、その後、あなたは本質的

c(i) = []; 

を呼び出している。これは、c要素

のi番目の要素を削除しますので、以下の行決して真実ではありません!

if isempty(c(i)) == 1 

代わりに、空の値を処理する必要があります。

index = find(ismember(date_sim(:), date_exp(i)), 1); 

%// Only assign the index if it isn't an empty array 
if ~isempty(index) 
    c(i) = index; 
end 

あなたの最初の行列がゼロの完全なすでにあるので、あなたは、ゼロを割り当てることを心配する必要はありません。

Aより良いオプション

さておきことのすべては、それはおそらく、すべてではないループに多くのより良いアプローチをだろうし、(あなたがdatenumに渡す前に、アレイ上)の代わりに与えることismembersecond outputを使用しますあなたはと同じ結果をより多くより効率的な方法です。

[~, c] = ismember(date_exp(:,1:6), date_sim(:,1:6), 'rows');