Matlab中不使用嵌入函数的自协方差和互协方差函数

Matlab中不使用嵌入函数的自协方差和互协方差函数,matlab,covariance,Matlab,Covariance,x和y是1x10000个向量 我已经计算了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 var

x
y
是1x10000个向量

我已经计算了
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

重新编写此代码:

%%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
是一个非常大的向量,对于k=1:Nx,取最后一个for循环
的方法是生成一个[Nx Nx]矩阵,我现在将它保留在上面的答案中。另外,如果中有
parfor
函数,则可以将其并行化,使其运行得更快。

重新编写此代码:

%%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
是一个非常大的向量,对于k=1:Nx,取最后一个for循环
的方法是生成一个[Nx Nx]矩阵,我现在将它保留在上面的答案中。另外,如果在中有
parfor
函数,则可以将其并行化以使其运行更快。

使用
FFT(corr(x,y))=FFT(x)*conj(FFTy))

要获得互协方差,只需将相关性乘以标准偏差:

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

要获得自协方差,请计算
x
与自身之间的互协方差。

使用
FFT(corr(x,y))=FFT(x)*conj(FFTy))

要获得互协方差,只需将相关性乘以标准偏差:

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

要获得自协方差,请计算
x
与自身之间的互协方差。

是否使用
conv
fft
允许?:-)如果允许使用
fft
,请查看我的答案。是否允许使用
conv
fft
呢?:-)如果允许
fft
,请看我的答案。这是自协方差函数吗?一般来说,这是互协方差,但如果替换
y=x
(即,如果计算
x
与自身之间的互协方差),则会得到自协方差。您可以将结果与
xcorr(x,y)
进行比较,并参见.corrxy=[corrxy(end-length(x)+2:end);corrxy(1:length(x));被连接的数组的维数不一致。这是用于自协方差函数吗?一般来说,这是用于互协方差,但如果替换
y=x
(即,如果计算
x
与自身之间的互协方差),则会得到自协方差。您可以将结果与
xcorr(x,y)
进行比较,并参见.corrxy=[corrxy(end-length(x)+2:end);corrxy(1:length(x));被连接的数组的维度不一致。当我运行代码时,我会出现如下错误:46 Cxx(k)=a'conj(b);%Cxx(k)始终为1x1。()是矩阵乘法吗???内存不足。为你的选项键入帮助记忆。我认为这与我们正在创建的变量的大小有关。我不能确定,但也许您的系统无法处理x、Cxx、a和b(所有这些都在[100000 x 1]的数量级上)?在任何情况下,很抱歉没有成功。当我运行您的代码时,我会出现如下错误:error In==>part3 at 46 Cxx(k)=a'conj(b);%Cxx(k)始终为1x1。()是矩阵乘法吗???内存不足。为你的选项键入帮助记忆。我认为这与我们正在创建的变量的大小有关。我不能确定,但也许您的系统无法处理x、Cxx、a和b(所有这些都在[100000 x 1]的数量级上)?无论如何,很抱歉没有成功。