-1

私はmatlabに次のコードを持っていますが、これは非常に遅いです。このコードは、スタックオーバーフローの以前の投稿に関連しています。matlabを高速化する方法があるので、コードを実行すると、更新された図が表示されます。画像ですが、何も表示されません

%% Loading Data
cd('D:\MatlabTest\15-07SpeedSensitivity\0.3');
clear all
row=101;
column=311;

%%
%Coefficients Creation
N=5;
W = [0.005 0.10;0.10 0.20;0.20 0.30;0.30 0.40;0.40 0.50;0.50 0.60 ;0.60 0.70;0.70 0.80 ;0.80 0.90;0.90 1.0];
for ind=1:9
    wn = W(ind,:);
    [b,a] = butter(N,wn);
    bCoeff{ind}=b;
    aCoeff{ind}=a;
end
[bCoeff{10},aCoeff{10}]=butter(N,0.9,'high');

%%
%filter initialization
ZState = cell(1,10);
for i=1:10
    ZState{i} = zeros(max(length(aCoeff{i}), length(aCoeff{i})) - 1, 1); %# This is the initial filter state
end
%%
bands=10;
for b=1:bands
    Yout{b}{row, column}=[];
end

%%
j=1;
K = 1000:4000;
window = zeros(1,10);
figure;
y = 0;         %# Preallocate memory for output
j=0;
buffSize=10;
tempMean{row,column}=[];
Gibbs=(length(K)*3)/100;
fImg{1}(row,column)=0;
%load one image
for i = 1000:length(K)
    disp(i)
    str = int2str(i);
    str1 = strcat(str,'.mat');
    load(str1);
    D(:,:) = A(100:200 ,200:510);
    %go throught the columns and rows
    for p = 1:row
        for q = 1:column
            %calculte the temporal mean value based on previous ones
            if(size(tempMean{p,q})<buffSize) %init the first 10
                tempMean{p,q}=[D(p,q) tempMean{p,q}];
            else
                tempMean{p,q}=[D(p,q) tempMean{p,q}(1:end-1)];
            end
            if(mean2(tempMean{p,q})==0)
                x=0;
            else
                x = double(D(p,q)/mean2(tempMean{p,q}));
            end
            %filtering for 10 bands, based on the previous state
            for f = 1:10
                [y, ZState{f}] = filter(bCoeff{f},aCoeff{f},x,ZState{f});
                if(j<Gibbs)
                    continue;
                end
                if(size(Yout{f}{p,q})<10)%init the first 10 after Gibbs phenomenon
                    Yout{f}{p,q} = [y.^2 Yout{f}{p,q}];
                else
                    Yout{f}{p,q} = [y.^2 Yout{f}{p,q}(1:end-1)];
                    fImg{f}(p,q)=mean2(Yout{f}{p,q});
                end
            end
        end
    end
     if(size(fImg{1}(1,1))>1)   
    for k = 1:10
        subplot(5,2,1);
        subimage(fImg{k}*5000, [0 0.5]);
        colormap jet
    end
    pause(0.01);
     end
    j=j+1;
end
disp('Done Loading...')`
4

1 に答える 1

1

まあ、私は、、...、1000.matを持っていないので、これを正しくテストすることはできません。1001.mat4000.mat

とにかく、私があなたにオフハンドで言うことができるのは

  • ネストされたループは一般的に悪い考えです。あなたが持っている4つの入れ子になったループを防ぐことにあなたの努力のほとんどを入れてください

  • ほとんどのループ本体には、外部の非組み込み関数(、、 ...)への参照が含まれていmeans2ますint2str。これは、JITコンパイルを適用できず、for-loopがインタープリターの速度で実行されることを意味します。

  • 内容YoutfImgは、最も内側の各反復でサイズを変更します。サイズの変更は避けるか、少なくとも非常に小さなループに保つ必要があります。

変数のサイズを変更するということは、Matlabがより大きな一時変数を作成し、元の配列の内容を一時変数にコピーし、それに新しいデータを追加し、一時変数を元の変数に割り当て、クリーンアップする必要があるということです。混乱。ご存知のように、この無意味なコピーは、何度も実行する必要がある場合(実行する場合)に多くの時間がかかるため、配列全体を事前に割り当てるように努めてください

これ以外に、matファイルなしで行くことはできません。@slaytonによって提案されているように、Matlabプロファイラーの使用方法を学びます。私が強調したポイントはおそらく飛び出します(データのロードもそうですが、それを改善することはできません(すべてのデータファイルがメモリに収まらない限り))

于 2012-08-09T04:59:04.690 に答える