public static float [,] covariance(
            float [][] data)
        {
            data = ToolsCollection.Transpose(data);
            int column_count = data.Length;

            float [,] covariance_array = new float [column_count, column_count];
            float [] means = new float [column_count];

            for (int index_column = 0; index_column < column_count; index_column++)
            {
                means[index_column] = ToolsMathStatistics.Mean(data[index_column]);
            }

            for (int index_column = 0; index_column < column_count; index_column++)
            {
                covariance_array[index_column, index_column] = ToolsMathCollectionFloat
                                                               .covariance(data[index_column], data[index_column], means[index_column], means[index_column]);
            }

            for (int index_row = 0; index_row < column_count; index_row++)
            {
                for (int index_column = index_row + 1; index_column < column_count; index_column++)
                {
                    float covariance = ToolsMathCollectionFloat
                                       .covariance(data[index_row], data[index_column], means[index_row], means[index_column]);
                    covariance_array[index_row, index_column] = covariance;
                    covariance_array[index_column, index_row] = covariance;
                }
            }
            return(covariance_array);
        }
        public IFunctionBijective <float [], float []> Generate(
            IList <float []> instances)
        {
            float[,] array            = ToolsCollection.ConvertToTable(instances);
            float[,] array_transposed = ToolsCollection.Transpose(array);
            float [] lower_bounds = new float [array_transposed.Length];
            float [] upper_bounds = new float [array_transposed.Length];

            for (int index = 0; index < array_transposed.Length; index++)
            {
                lower_bounds[index] = ToolsMathStatistics.QuantileSorted(array_transposed.Select1DIndex0(index), quantile);
                upper_bounds[index] = ToolsMathStatistics.QuantileSorted(array_transposed.Select1DIndex0(index), 1 - quantile);
            }
            return(new TransformRescale(lower_bounds, upper_bounds));
        }