public static Value HarmonicMean(MatrixValue M)
{
if (M.Length == 0)
{
return ScalarValue.Zero;
}
if (M.IsVector)
{
var q = ScalarValue.Zero;
for (var i = 1; i <= M.Length; i++)
{
q += (1.0 / M[i]);
}
return M.Length / q;
}
var s = new MatrixValue(1, M.DimensionX);
for (var i = 1; i < M.DimensionX; i++)
{
s[1, i] = ScalarValue.Zero;
}
for (var i = 1; i <= M.DimensionY; i++)
{
for (var j = 1; j <= M.DimensionX; j++)
{
s[1, j] += (1.0 / M[i, j]);
}
}
for (var j = 1; j <= s.DimensionX; j++)
{
s[1, j] = (M.DimensionY / s[1, j]);
}
return s;
}