private static double[,] gaussian(int length)
{
//Dimensione dispari
if (length % 2 == 0)
length++;
// deviazione std, da passare per una migliore implementazione come parametro della funzione
double stddev = length / 4.9;
// kernel gaussiano monodimensionale
double[] monodimensional = new double[length];
for (int i = 0; i < length; i++)
{
int x = i - length / 2;
double exponent = x * x / (-2 * stddev * stddev);
monodimensional[i] = Math.Exp(exponent);
}
// kernel gaussiano bidimensionale
double[,] bidimensional = new double[length, length];
double sum = 0.0;
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length; j++)
{
bidimensional[i, j] = monodimensional[i] * monodimensional[j];
sum += bidimensional[i, j];
}
}
//Normalizzazione
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length; j++)
{
bidimensional[i, j] /= sum;
}
}
return bidimensional;
}