在matlab中计算1000个5x5矩阵的协方差

时间:2013-07-02 20:42:26

标签: matlab

我有1000个5x5矩阵( Xm ),如下所示:

enter image description here

每个$(x_ij) m $是从分布中得出的点估计值。我想计算每个$ x {ij} $的协方差cov,其中i = 1..n,并且j = 1..n在红色箭头方向。< / p>

例如,$ X_m $的方差是`var(X,0,3),它给出了5x5的方差矩阵。我能以同样的方式计算协方差吗?

尝试回答

到目前为止,我已经这样做了:

for m=1:1000
Xm_new(m,:)=reshape(Xm(:,:,m)',25,1);
end

cov(Xm_new)
spy(Xm_new) gives me this unusual looking sparse matrix:

enter image description here

2 个答案:

答案 0 :(得分:5)

如果您在命令窗口中查看covedit cov),您可能会发现它不支持多维数组的原因。它执行输入矩阵的转置和矩阵乘法:xc' * xc。这两个操作都不支持多维数组,我想任何编写该函数的人都决定不进行一般化工作(但仍然可以与Mathworks联系make a feature request)。

在你的情况下,如果我们从cov获取基本代码并做出一些假设,我们可以写一个协方差函数M文件支持3-D数组:

function x = cov3d(x)
% Based on Matlab's cov, version 5.16.4.10

[m,n,p] = size(x);
if m == 1
    x = zeros(n,n,p,class(x));
else
    x = bsxfun(@minus,x,sum(x,1)/m);
    for i = 1:p
        xi = x(:,:,i);
        x(:,:,i) = xi'*xi;
    end
    x = x/(m-1);
end

请注意,此简单代码假定x是沿第三维堆叠的一系列二维矩阵。标准化标志为0,默认值为cov。它可以通过一些工作扩展到像var这样的多个维度。在我的时间中,它比在cov(x(:,:,i))循环中调用for的函数快10倍。

是的,我使用了for循环。 faster ways to do this可能有也可能没有,但在这种情况下for循环将是faster than most schemes,尤其是当您的数组大小不是先验的时候。

答案 1 :(得分:2)

以下答案也适用于矩形矩阵xi=x(:,:,i)

function xy = cov3d(x)

[m,n,p] = size(x);
if m == 1
    x = zeros(n,n,p,class(x));
else
    xc = bsxfun(@minus,x,sum(x,1)/m);
    for i = 1:p
        xci = xc(:,:,i);
        xy(:,:,i) = xci'*xci;
    end
    xy = xy/(m-1);
end

我的答案与horchler非常相似,但是horchler的代码不适用于矩形矩阵xi(其尺寸与xi'*xi尺寸不同)。