0

株価の時間の列がある非常に大きなマトリックス (750000 x 6) があります。時間間隔は均一ではないため、新しい時間を補間しました。平日の勤務時間のみを含めたいので、補間された時間がその時間内にあるかどうかを確認し、それらのエントリを新しい行列にコピーする for ループがあります。ただし、私のプログラムの実行には永遠に時間がかかります(> 10分)。これは私の元のコードです:

A = IBM;
times = A(:,1);
incr = t;
uniqday = datevec(times);
uniqday = unique(uniqday(:,1:3), 'rows'); % unique days for data

% Computes interpolated prices at sampling interval
interptimes = (times(1):incr:times(end)).';      

% Fractional hours into the day
frac_hours = 24*(interptimes - floor(interptimes));    
% Exclude interpolated times outside of trading hours
newtimes = interptimes((frac_hours > 0) & (frac_hours < 19.1)); 

% Exclude weekends & holidays
newtimesvec = datevec(newtimes);
newtimesvec2 = zeros(length(newtimesvec),6);
for j = 1:length(uniqday)
    for i = 1:length(newtimesvec)
        if newtimesvec(i,1:3) == uniqday(j,:)
              newtimesvec2(i,:) = newtimesvec(i,:);
        else       %Program always get stuck at this line
        end
    end
end

したがって、補間された時間配列のエントリを削除すると、新しいマトリックスにコピーするよりも高速になるのではないかと考えましたが、エントリが削除されると、補間された時間配列のサイズが変更されるため、この for ループによりマトリックスの外部にアクセスします。どうすればこれを修正できるかわかりません。

for i = 1:length(interptimes)
    for j = 1:length(uniqday)
        if interptimes(j,1:3) == uniqday(j,:)
        else
            interptimes(j,:) = [];
        end 
    end
end
4

1 に答える 1

0

ismemberにある日を見つけるために使用できますuniqday

newtimesvec2 = newtimesvec(ismember(newtimesvec(:,1:3),uniqday,'rows'),:);
于 2013-03-01T02:44:16.883 に答える