x
和y
是1x100000个向量。
我计算了x
和y
的均值和方差。当我想计算自协方差和交叉协方差函数时,由于我的循环,模拟可能持续5分钟。不允许使用xcorr
,xcov
,mean
,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
答案 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
函数,那么您可以将其并行化以使其运行得更快。