Matlab中的自协方差和交叉协方差函数,不使用内置函数

时间:2012-05-19 14:43:49

标签: matlab covariance

xy是1x100000个向量。

Questions

我计算了xy的均值和方差。当我想计算自协方差和交叉协方差函数时,由于我的循环,模拟可能持续5分钟。不允许使用xcorrxcovmeancovvar等。

请帮帮我。

提前致谢。

%%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

2 个答案:

答案 0 :(得分: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与其自身之间的交叉协方差。

答案 1 :(得分: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 Toolbox中有parfor函数,那么您可以将其并行化以使其运行得更快。