2013-08-24 4 views
0

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

Например у меня есть набор с, как это

a= [20010110 2310 10; 
     20010110 2311 20; 
     20010110 2313 30] 
    b= [20010110 2309 50; 
    20010110 2312 52] 

и я хочу, то я получаю это

c =[20010110 2310 50;; 
     20010110 2311 50 
     20010110 2313 52] 

с довольно много то же самое, как, но это только индекс ,

так я пишу это

function [setAjustado] = ajustar(SetCorreto,SetParaAjustar) 

    dataCorreto = SetCorreto(:,1); % get the date from the correct set 
    dataAjustar = SetParaAjustar(:,1); % get the date from the set to be corrected 
    minCorreto = SetCorreto(:,2); % get the timeframe from the correct set 
    minAjustar = SetParaAjustar(:,2);get the timeframe from the set to be corrected 
    setAjustado = zeros(size(SetCorreto)); %corrected set 
    idxI = dataAjustar == dataCorreto(1); %generating the first range to search 

    for i=2:size(SetCorreto,1) 
    try 

     if (i >1 && dataCorreto(i) ~= dataCorreto(i-1)) % if the dates are the same, i dont need to look for the range again 
     idxI = dataAjustar == dataCorreto(i); % generate the range to search 
     idxIa = find(idxI==1,1); % find the first index 
     end 

     idx = find(minAjustar(idxI)>=minCorreto(i),1) +idxIa; % find the nearest occurency in the set to be corrected to match the correct set 
     setAjustado(i,:) = SetParaAjustar(idx,:); %replace all the line. This line have prices close, max, low and open. 
     setAjustado(i,2) = minCorreto(i); %adjust the timeframe to match the correct set 
    catch 
     if i==1 % in case of i to be greater then the size of set to be corrected 
      a=i; 
     else 
      a= i-1; 
     end 
    setAjustado(i,:) = setAjustado(a,:); % will copy the last line created in corrected set 

     end 
    end 

но им думать, что это вещь довольно медленно ... Может кто-то помочь мне, чтобы ускорить это дело?

Tks заранее!

+0

Я не понимаю, что вы подразумеваете под «syncrhonise». Что именно вы хотите сделать? –

ответ

1

На основании данных, размещенных и ваши комментарии, вот что-то я попробовал:

% first two columns are considered "keys", last one contains the values 
a = [20010110 2310 10; 
    20010110 2311 20; 
    20010110 2313 30]; 
b = [20010110 2309 50; 
    20010110 2312 52]; 

% get a row identifier for each instance 
[~,~,ind] = unique([a(:,1:2);b(:,1:2)], 'rows'); 
ind_a = ind(1:size(a,1)); 
ind_b = ind(size(a,1)+1:end); 

% merge the data 
c = nan(max(ind),size(a,2)); 
c(ind_a,1:end-1) = a(:,1:end-1); 
c(ind_b,:) = b; 

% fill-in missing values from last know values 
for i=2:size(c,1) 
    if isnan(c(i,end)) 
     c(i,end) = c(i-1,end); 
    end 
end 

% only keep instances matching A's rows 
c = c(ind_a,:); 

Результат:

>> c 
c = 
    20010110  2310   50 
    20010110  2311   50 
    20010110  2313   52 

Если фактические данные содержит несколько столбцов, вам нужно отрегулируйте код соответствующим образом.

+0

Amro, я сделал небольшую модификацию, и все работает как шарм. Спасибо большое! % объединить данные c = nan (max (ind), размер (a, 2)); c (ind_a, 1: 2) = a (:, 1: 2); c (ind_b, :) = b; % заполнение отсутствующих значений из последних знанных значений для i = 2: размер (c, 1) if isnan (c (i, end)) c (i, 3: end) = c (i-1, 3: конец); конец конец –

Смежные вопросы