我想知道MATLAB是否有一个工具箱可以用稀疏矩阵进行常见的矩阵运算。
使用密集矩阵,我可以计算相关图矩阵:
R = rand(10,100)
[r,p] = corr(R)
使用稀疏矩阵我很乐意:
S = sprand(10,100,.2)
[r,p] = corr(S)
但是,引发了以下错误:
Error using betainc
Inputs must be real, full, and double or single.
Error in tcdf (line 70)
p(t) = betainc(xsq(t) ./ (v(t) + xsq(t)), 0.5, v(t)/2, 'upper') / 2;
Error in corr>pvalPearson (line 720)
p = 2*tcdf(-abs(t),n-2);
Error in corr>corrPearson (line 321)
pval(ltri) = pvalPearson(tail, coef(ltri), n);
Error in corr (line 204)
[coef,pval] = corrFun(rows,tail,x);
任何人都可以帮助我吗?
答案 0 :(得分:0)
Cmon ppl,让我们做一些数学!设x是随机向量。相关矩阵CORR(x_i,x_j)中的条目由下式给出:
CORR(x_i, x_j) = COV(x_i, x_j) / (SQRT(VAR(x_i)) *SQRT(VAR(x_j));
也就是说,为了构建我们的相关矩阵,我们需要协方差矩阵,它也给出了各个方差。协方差公式:COV(x) = E[x*x'] - E[x]E[x]'
。然后,我们可以使用样本时刻(即E[x*x']
和X'*X/n
)近似人口时刻mean(X)
因此以下Matlab代码:
[n, k] = size(X);
Exxprim = full(X'*X)/n; %I'm shocked if this isn't full so let's drop sparse now
Ex = full(mean(X))'; %same deal
COVX = (Exxprim - Ex*Ex');
STDEVX = sqrt(diag(COVX));
CORRX = COVX ./ (STDEVX * STDEVX');
如果X'* X和mean(X)可以更有效地完成,因为X很稀疏,这可能会有所帮助。