2016-04-13 2 views
1

У меня есть два вектора длиной около 200 000. Они состоят из дат в формате данных.find возвращает пустую матрицу

%datenums 
date_exp = datenum(data_exp(:,1:6)); 
date_sim = datenum(data_sim(:,1:6)); 
  1. Я хочу найти даты в date_exp, которая существует в date_sim.

  2. Затем удалите значения из date_exp

Я использовал инструмент IsMember, но в конечном итоге на I = 38 находят retunrs: Неправильное назначение с прямоугольной пустой матрицей.

Ошибка в фильтре (строка 18)
с (я) = найти (IsMember (date_sim (:), date_exp (я)), 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 элемента

Поэтому следующую строку никогда не бывает правдой!

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 

Вам не придется беспокоиться о присвоении нулей, потому что ваша исходная матрица уже полные нули.

лучший вариант

Все это в сторону, это, вероятно, будет гораздо лучше подход не петлю на всех и вместо этого использовать second output из ismember (на массивах, прежде чем передать их datenum), чтобы дать у вас такой же результат в намного более эффективный способ.

[~, c] = ismember(date_exp(:,1:6), date_sim(:,1:6), 'rows'); 
Смежные вопросы