0

xおよびy1x100000 ベクトルです。

質問

と の平均と分散を計算しましxy。自己共分散関数と相互共分散関数を計算したい場合、ループのためにシミュレーションに 5 分ほどかかります。xcorrxcovmean、などcovは使用できません。var

私を助けてください。

前もって感謝します。

%%Mean of Vector x

Nx=length(x);
mx= sum(x)/Nx;

%%Mean of Vector y

Ny=length(y);
my=sum(y)/Ny;

%%Variance of x

varx=0;

for i=1:Nx
   varx=varx+(abs(x(i)-mx)^(2));
end
varx=varx/Nx;

%%Variance of y

vary=0;
for j=1:Ny 
   vary=vary+(abs(y(j)-my)^(2));
end
vary=vary/Ny;


%%Auto-Covariance function of x

for k=1:Nx  

Cxx(k)=0;

for i=1:(Nx-k+1)    
   Cxx(k)=Cxx(k)+(x(i+k-1)-mx)*conj((x(i)-my));  
end
end

%%Auto-Covariance function of y

for s=1:Ny  

Cyy(s)=0;

for j=1:(Ny-s+1)    
   Cyy(s)=Cyy(s)+(y(j+s-1)-my)*conj((y(j)-mx));  
end
end
4

2 に答える 2

4

次の事実を使用しFFT(corr(x, y)) = FFT(x) * conj(FFTy))ます。

corrxy = ifft(fft(x) .* conj(fft(y)));
corrxy = [corrxy(end - length(x) + 2:end); corrxy(1:length(x))];

相互共分散を取得するには、相関に標準偏差を掛けるだけです。

covarxy = corrxy * sqrt(varx) * sqrt(vary);

自己共分散を取得するには、 とそれ自体の間の相互共分散を計算しxます。

于 2012-05-19T15:42:01.237 に答える
0

このコードを書き直す:

%%Auto-Covariance function of x
for k=1:Nx  
    Cxx(k)=0;
    for i=1:(Nx-k+1)    
       Cxx(k)=Cxx(k)+(x(i+k-1)-mx)*conj((x(i)-my));  
    end
end

次のコードは、内側の for ループを取り出します。

% x is a [Nx x 1] vector (lets say Nx = 50)
Cxx = zeros(Nx,1); % [Nx x 1] vector of zeros
for k = 1:Nx,
  a = (x(k:Nx)    -mx); % If k=3, then x(3:50) and a is [Nx-k+1 x 1]
  b = (x(1:Nx-k+1)-my); % If k=3, then x(1:48) and b is [Nx-k+1 x 1]
  Cxx(k) = a'*conj(b);  % Cxx(k) is always 1x1. (*) is a matrix multiply
end

xは非常に大きなベクトルであり、最後の for ループを取り出す方法for k=1:Nxは [Nx x Nx] 行列を作成することなので、今のところ上記の回答のままにしておきます。さらに、Parallel Computing Toolboxparforに関数がある場合は、それを並列化してさらに高速に実行できます。

于 2012-05-19T15:41:40.570 に答える