0

x并且y是 1x100000 个向量。

问题

我计算了 和 的均值和x方差y。当我想计算自协方差和互协方差函数时,由于我的循环,模拟可能持续 5 分钟。不允许使用xcorr, xcov, mean,covvar

请帮我。

提前致谢。

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