【问题标题】:Auto-covariance and Cross Covariance Function in Matlab without using imbuilt functionsMatlab中的自协方差和交叉协方差函数不使用内置函数
【发布时间】:2012-05-20 13:20:56
【问题描述】:

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

【问题讨论】:

  • 是否允许使用conv 或fft? :-)
  • 如果fft被允许,看看我的回答。

标签: matlab covariance


【解决方案1】:

使用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 与其自身之间的互协方差。

【讨论】:

  • 这是自协方差函数吗?
  • 一般来说这是针对cross-covariance,但是如果你替换y = x(也就是说,如果你计算x和它自身之间的cross-covariance),你会得到自协方差。您可以将结果与xcorr(x, y) 进行比较并查看。
  • corrxy = [corrxy(end - length(x) + 2:end); corrxy(1:长度(x))];被连接的数组的维度不一致。
【解决方案2】:

重写这段代码:

%%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 函数,那么您可以并行化它以使其运行得更快。

【讨论】:

  • 当我运行你的代码时,我会遇到这样的错误: Error in ==> part3 at 46 Cxx(k) = a'conj(b); % Cxx(k) 始终为 1x1。 () 是矩阵乘法???记不清。键入 HELP MEMORY 作为您的选项。
  • 我认为这与我们正在创建的变量的大小有关。 mathworks.com/support/tech-notes/1100/1107.html 我不能确定,但​​也许您的系统无法处理 x、Cxx、a 和 b(所有这些都在 [100,000 x 1] 的数量级上)?无论如何,很抱歉没有成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多