public static MatrixValue Covariance(MatrixValue M)
{
if (M.Length == 0)
{
return new MatrixValue();
}
if (M.IsVector)
{
return new MatrixValue(1, 1, Variance(M) as ScalarValue);
}
var avg = Average(M) as MatrixValue;
var scale = 1.0;
var s = new MatrixValue(M.DimensionX, M.DimensionX);
for (var i = 1; i <= M.DimensionY; i++)
{
for (var j = 1; j <= M.DimensionX; j++)
{
for (var k = 1; k <= M.DimensionX; k++)
{
s[k, j] += (M[i, j] - avg[j]) * (M[i, k] - avg[k]);
}
}
}
scale /= M.DimensionY;
for (var i = 1; i <= s.DimensionY; i++)
{
for (var j = 1; j <= s.DimensionX; j++)
{
s[i, j] *= scale;
}
}
return s;
}