我有1000个5x5矩阵( Xm ),如下所示:
每个$(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:
答案 0 :(得分:5)
如果您在命令窗口中查看cov
(edit 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
尺寸不同)。