0

一連の年代順のシリアル番号を持つ配列と、数値に関連付けられたランダムなシリアル番号を持つ別のソース配列があります。このコードは、MATLAB で新しい cell 配列を作成し、1 つの列に完全に時系列のシリアル番号を使用し、シリアル番号が両方の元のソース配列で一致する場合は、次の列に関連する数値を挿入します。そうでない場合、コードは、新しい一致が見つかるまで、以前に関連付けられた値を単純にコピーします。

j = 1;
A = {random{1:end,1}};
B = cell2mat(A);
value = random{1,2};
data = cell(length(serial), 1);
data(:,1) = serial(:,1);

h = waitbar(0,'Please Wait...');
steps = length(serial);

for k = 1:length(serial)

    [row1, col1, vec1] = find(B == serial{k,1});
    tf1 = isempty(vec1);

    if (tf1 == 0)
        prices = random{col1,2}; 
        data(j,2) = num2cell(value);
        j = j + 1;
    else
        data(j,2) = num2cell(value);
        j = j + 1;
    end

    waitbar(k/steps,h,['Please Wait... ' num2str(k/steps*100) ' %'])

end

close(h);

現在、コードの実行時間は約 4 時間です。このコードをより高速に実行したいと考えています。そうするための方法を提案してください。

アップデート

source input (serial)
1
2
3
4
5
6
7

source input (random)
1    100
2    105 
4    106
7    107

desired output (data)
SR No           Value
1               100
2               105
3               105
4               106
5               106
6               106
7               107
4

2 に答える 2

4

まず、MATLAB プロファイラー (「ドキュメント プロファイル」を参照) を実行し、実行時間の大半が発生している場所を確認します。

次に、反復ごとにウェイトバーを更新しないでください。特に、シリアルに多数の (> 100) 要素が含まれている場合。

次のようにします。

if (mod(k, 100)==0) % update on every 100th iteration
     waitbar(k/steps,h,['Please Wait... ' num2str(k/steps*100) ' %'])
end
于 2013-07-30T07:02:22.060 に答える
0

いくつかのポイント:

まず、サンプルの入力データと出力データを提供していただけると大変助かります。

data1 つの列として初期化してから、ループの 2 番目の列を埋めるのはなぜですか? むしろ、前もって 2 列として初期化します。data = cell(length(serial), 2);

はとはjまったく異なります。私と同じように見えます。両方の行kを削除できます。j = j + 1

tf1 = isempty(vec1); if (tf1 == 0)...は単一行と同じです:if (!isempty(vec1))またはさらに良い場合は、あなたとあなたif(isempty(vec1))のコードを交換してください。elseif

しかし、(短い) サンプルの入力データと出力データを提供すれば、おそらく高速なベクトル化されたソリューションを見つけることができると思います。

于 2013-07-30T10:48:58.067 に答える