Как я могу оптимизировать этот временной код в Matlab? - PullRequest
2 голосов
/ 27 января 2011

В настоящее время у меня есть две временные шкалы (timeline1 и timeline2), с совпадающими данными (data1 и data2).Временные шкалы почти, но не совсем совпадают (около 90% общих значений).

Я пытаюсь найти значения из данных data1 и data2, которые соответствуют одинаковым временным меткам (игнорируя все другие значения)Моя первая тривиальная реализация выглядит следующим образом (и, очевидно, ужасно медленной, учитывая, что мои временные шкалы содержат тысячи значений).Есть идеи как это улучшить?Я уверен, что есть разумный способ сделать это, избегая цикла for или операции поиска ...

% We expect the common timeline to contain
% 0 1 4 5 9
timeline1 = [0 1 4 5 7 8 9 10];
timeline2 = [0 1 2 4 5 6 9];

% Some bogus data
data1 = timeline1*10;
data2 = timeline2*20;

reconstructedData1 = data1;
reconstructedData2 = zeros(size(data1));

currentSearchPosition = 1;

for t = 1:length(timeline1)
   % We only look beyond the previous matching location, to speed up find
   matchingIndex = find(timeline2(currentSearchPosition:end) == timeline1(t), 1);

   if isempty(matchingIndex)
      reconstructedData1(t) = nan;
      reconstructedData2(t) = nan;
   else
      reconstructedData2(t) = data2(matchingIndex+currentSearchPosition-1);
      currentSearchPosition = currentSearchPosition+matchingIndex;
   end   

end

% Remove values from data1 for which no match was found in data2
reconstructedData1(isnan(reconstructedData1)) = [];
reconstructedData2(isnan(reconstructedData2)) = [];

Ответы [ 3 ]

3 голосов
/ 27 января 2011

Вы можете использовать функцию Matlab intersect:

c = intersect(A, B)
2 голосов
/ 27 января 2011

Не могли бы вы просто позвонить INTERSECT ?

commonTimeline = intersect(timeline1,timeline2);
commonTimeline =
     0     1     4     5     9
1 голос
/ 27 января 2011

Вам нужно использовать индексы, возвращаемые из intersect.

[~ ia ib] = intersect(timeline1, timeline2);
recondata1 = data1(ia);
recondata2 = data2(ib);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...