2016-06-03 5 views
1

У меня есть набор траекторий пользователей: каждое текущее местоположение трейлеров имеет следующие поля: _ [userId год месяц день час минута вторая широта долгота regionId]. Основываясь на полевом дне, я хочу разделить траектории на основе суточного масштаба в интервале разных часов: 3 часа, 4 часа, 2 часа. Я понял, что это код, которые работают на интервале 4 часаmatlab: как найти интервал данных

% decomposedTraj is a struct that contains the trajectories based on daily scale 
    for i=1:size(decomposedTraj,2) 
     if ~isempty(decomposedTraj(i).dailyScaled) 
     % find the intervals 
     % interval [0-4]hours 
     Interval(i).interval_1=(decomposedTraj(i).dailyScaled(:,5)>=0&decomposedTraj(i).dailyScaled(:,5)<4); 
     % interval [4-8]hours   
     Interval(i).interval_2=(decomposedTraj(i).dailyScaled(:,5)>=4&decomposedTraj(i).dailyScaled(:,5)<8); 
     % interval [8-12]hours 
     Interval(i).interval_3=(decomposedTraj(i).dailyScaled(:,5)>=8&decomposedTraj(i).dailyScaled(:,5)<12); 
     % interval [12-16]hours 
     Interval(i).interval_4=(decomposedTraj(i).dailyScaled(:,5)>=12&decomposedTraj(i).dailyScaled(:,5)<16); 
     % interval [16-20]hours 
     Interval(i).interval_5=(decomposedTraj(i).dailyScaled(:,5)>=16&decomposedTraj(i).dailyScaled(:,5)<20); 
     % interval [20-0]hours 
     Interval(i).interval_6=(decomposedTraj(i).dailyScaled(:,5)>=20); 
     end  
    end 

или более легко понять логику кода:

A=[22;19;15;15;0;20;22;19;15;15;0;20;20;0;22;21;17;23;22]'; 
A(A>=0&A<4) 
A(A>=4&A<8) 
A(A>=8&A<12) 
A(A>=12&A<16) 
A(A>=16&A<20) 
A(A>=20) 

Он работает и дает правильный ответ, но это не умный: если Я хочу изменить интервал, я должен изменить весь код ... Можете ли вы помочь мне найти интеллектуальное решение, более динамичное из этого? спасибо 0 Комментарии

ответ

2

Интервал k определяется как [(k-1)*N k*N] где N=4 в вашем примере. Таким образом, вы можете сделать то же самое, используя for цикл:

for k=1:floor(24/N) 
    Interval(k) = A(A>=(k-1)*N & A<k*N); 
end 

Обратите внимание, что в этом примере A(A>=(k-1)*N & A<k*N) не обязательно тот же размер для каждого k так Interval должен быть массивом ячеек.

+1

ваш код дает мне эту ошибку: 'Операнды || и операторы && должны быть преобразованы в логические скалярные значения. ' – elis56

+0

@ elis56 Похоже, что это исправлено в редактировании. –

+0

Да, вы правы, это была ошибка. Должно быть '&' вместо '&&'. – ThP