5

いくつかの指針に感謝します。約 100 万行のデータを読み取っていますが、次のコードではほぼ 24 時間かかります。実行時間を改善するにはどうすればよいですか?

配列には、開始からDayn 日目の値が含まれており特定の日のレコードが複数あります。unique_idプログラムは、特定の ID ( に格納されている) が 180 日以内に繰り返されるかどうかをチェックします。

%// calculating the number of repeats within 180 days
fid2 = 'data_050913/Unique_id_repeat_count1.xlsx';
fid1 = 'data_050913/data_050913_2000.csv';

fid_data = fopen(fid1);
data     = fgetl(fid_data); %// the first line, title line
ep       = 0; %// position point number

while 1
    data = fgetl(fid_data);
    if(length(data)<10)
      break;
    end
    ep = ep+1;
    id = find(data == ',');
    unique_id(ep) = str2num(data(1:id(1)-1)); 
    day(ep) = str2num(data(id(8)+1:id(9)-1)); 
end

repeat = zeros(ep,1);

tic
i = 1; 
count = 0;
while i <= ep
    j = i+1;
    while ( (j<=ep) && (day(j)<= day(i)+179) )
        if unique_id(i) == unique_id(j)
           count = 1;
           break;
        end
        j = j+1;
    end

    repeat(i,1) = count;

    count = 0;
    i = i+1;
end
toc

i = 1;
k = 1;
while i<=ep
    count = repeat(i,1);
    j=i;
    while (day(j) == day(i))
        count = repeat(j,1)+count;
        j = j+1;
        if j > ep
            break;
        end
    end

    day_final(k,1)= day(i);
    repeat_final(k,1) = count;

    k = k+1;
    i = j;
end

xlswrite(fid2,day_final,'Repeat_Count','A2');
xlswrite(fid2,repeat_final,'Repeat_Count','B2');

ありがとう

4

4 に答える 4

3

まだこれを行っていない場合は、可能であればすべてのメモリを事前に割り当てるようにしてください。これを行うことで、Matlab スクリプトが 24 時間から 8 分に短縮されるのを見てきました。

関数を使用して、増加するすべての配列 ( 、、、および) にzerosメモリを事前に割り当てます。dayunique_idrepeatday_finalrepeat_final

x = zeros(1000); %// Creates a 1000 element array of all zeros
于 2013-09-09T08:51:21.157 に答える
1

unique_idこれは、多くの異なる値を持つことができる場合(そうでない場合でも)、私が行う方法です。

私のシステムでは、操作に 5 秒もかかりません。

x = round(rand(1000000,1)*10);
result = zeros(size(x));
windowsize = 180;
for t = 1:(numel(x)-windowsize)
    result(t) = sum(x(t+1:t+windowsize)==x(t));
end

これが必要だと思います。「前方」または「後方」のどちらを見たいかを確認してください。

于 2013-09-09T09:43:51.710 に答える