Эквивалентные функции Matlab с использованием mathdotnet

Как мы можем реализовать приведенную ниже функцию Matlab на С#, используя библиотеку math.net.

Многомерное нормальное случайное распределение — http://in.mathworks.com/help/stats/mvnrnd.html

r = mvnrnd(MU,SIGMA,cases)

Также ниже функция math.net не возвращает никаких результатов. Я пробовал другие методы, такие как Selectpermutations/SelectVariations с/без повторения. Но ни один из методов не возвращает никаких результатов.

IEnumerable<double> input=new double[] { 1, 2, 3, 4, 5 };
var re = input.SelectCombinationWithRepetition(3);

введите здесь описание изображения

Я что-то пропустил??


person malkam    schedule 03.09.2015    source источник


Ответы (2)


Насколько я знаю, в Math.net нет легкодоступной функции, которая дает вам многомерные случайные нормальные числа. Однако вы можете легко написать специальную функцию для этой цели, которая использует разложение Холецкого ковариационной матрицы. Действительно, когда каждый элемент вектора Z с p-вариантами независимо распределен в соответствии со стандартным нормальным распределением N(0,1), вектор X = M + L * Z распределяется в соответствии с нормальным распределением с p-вариантами, средний вектор совокупности которого равен M и чья ковариационная матрица равна S (где S = L*L').

Поскольку я парень vb, я покажу здесь код vb для написания такой функции:

Public Function MvNRnd(Mu As Vector, Covariance As Matrix, Cases As Double) As Matrix

        Dim standardNormalDistribution As New Normal(0, 1)
        Dim randomValues(Cases - 1) As Vector
        Dim cholesky As Factorization.Cholesky(Of Double) = Covariance.Cholesky


        For i As Integer = 0 To Cases - 1

            'generate independent standard normal random numbers
            randomValues(i) = DenseVector.CreateRandom(Mu.Count, standardNormalDistribution)

            'generate multivariate normal random numbers
            cholesky.Factor.Multiply(randomValues(i), randomValues(i))
            randomValues(i) += Mu

        Next


        Return DenseMatrix.OfRowVectors(randomValues)

    End Function

Эквивалентный код C# должен выглядеть следующим образом (переведено через http://converter.telerik.com/):

public Matrix MvNRnd(Vector Mu, Matrix Covariance, double Cases)
{

    Normal standardNormalDistribution = new Normal(0, 1);
    Vector[] randomValues = new Vector[Cases];
    Factorization.Cholesky<double> cholesky = Covariance.Cholesky;



    for (int i = 0; i <= Cases - 1; i++) {
        //generate independent standard normal random numbers
        randomValues(i) = DenseVector.CreateRandom(Mu.Count, standardNormalDistribution);

        //generate multivariate normal random numbers
        cholesky.Factor.Multiply(randomValues(i), randomValues(i));
        randomValues(i) += Mu;

    }


    return DenseMatrix.OfRowVectors(randomValues);

}
person Philippe.H    schedule 23.09.2015

person    schedule
comment
Не могли бы вы добавить объяснение вашего решения? - person Kmeixner; 10.03.2016
comment
В решении используется библиотека Math.net (mathdotnet.com), в которой есть функция для многомерных случайных нормальных чисел. (numerics.mathdotnet.com/api/mathnet.numerics.distributions/< /а>). Mu и Sigma определены на странице Mathworks (in.mathworks.com/help/stats /mvnrnd.html), на который ссылались в исходном вопросе этой темы. - person porsove; 11.03.2016