1

2 つのベクトルの移動/ローリング相関を計算する関数を導出しようとしていますが、この関数を配列関数に適用する必要があるため、速度が優先されます。私が持っているもの(遅すぎる)はこれです:

Data1 = rand(3000,1);
Data2 = rand(3000,1); 

function y = MovCorr(Data1,Data2)

[N,~] = size(Data1);

correlationTS = nan(N, 1);

for t = 20+1:N
    correlationTS(t, :) = corr(Data1(t-20:t, 1),Data2(t-20:t,1),'rows','complete');
end
    y = correlationTS;
end

forローリング ウィンドウ インデックスを生成してから を適用する方法を知っていれば、ループをより効率的に実行できると考えていますaccumarray。助言がありますか?

4

1 に答える 1

3

@knedlsepp からのアドバイスに従って、movingstd のように filter を使用すると次の解決策が非常に高速であることがわかりました。

function Cor = MovCorr1(Data1,Data2,k)
y = zscore(Data2);
n = size(y,1);

if (n<k)
    Cor = NaN(n,1);
else
    x = zscore(Data1);
    x2 = x.^2;
    y2 = y.^2;
    xy = x .* y;
    A=1;
    B = ones(1,k);
    Stdx = sqrt((filter(B,A,x2) - (filter(B,A,x).^2)*(1/k))/(k-1));
    Stdy = sqrt((filter(B,A,y2) - (filter(B,A,y).^2)*(1/k))/(k-1));
    Cor = (filter(B,A,xy) - filter(B,A,x).*filter(B,A,y)/k)./((k-1)*Stdx.*Stdy);
    Cor(1:(k-1)) = NaN;
end
end

私の元のソリューションと比較すると、実行時間は次のとおりです。

tic
MovCorr(Data1,Data2);
toc
Elapsed time is 1.017552 seconds.

tic
MovCorr1(Data1,Data2,21);
toc
Elapsed time is 0.019400 seconds.
于 2015-02-23T10:05:56.127 に答える