Я работаю над реализацией функции плотности вероятности многомерного гауссиана в C ++, и я застрял в том, как лучше всего справиться со случаями, когда размерность> 2.
PDF гауссова может бытьзаписывается как
![multivariate gaussian pdf](https://i.stack.imgur.com/Z97fh.png)
, где (A) 'или A' представляет транспонирование «матрицы», созданной путем вычитания среднего из всех элементов x.В этом уравнении k - это число измерений, которое у нас есть, а сигма - ковариационная матрица, которая является матрицей akxk.Наконец, | X |означает определитель матрицы X.
В одномерном случае реализация pdf тривиальна.Даже в двумерном (k = 2) случае это тривиально.Однако, когда мы пойдем дальше двух измерений, реализация будет намного сложнее.
В двумерном случае у нас будет
![bivariate gaussian pdf](https://i.stack.imgur.com/oKBPv.png)
, где rho - этокорреляция между x и y, с корреляцией, равной
![correlation between two random variables X and Y](https://i.stack.imgur.com/fj4Px.png)
В этом случае я мог бы использовать Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
для реализации первого уравнения или просто вычислить все сам, используя второе уравнениебез использования упрощенного интерфейса линейной алгебры Эйгена.
Мои мысли о попытке многомерного случая, вероятно, начнутся с расширения приведенных выше уравнений до многомерного случая
![multivariate pdf](https://i.stack.imgur.com/rODv5.png)
с
![multivariate pdf](https://i.stack.imgur.com/Gvmu7.png)
Мои вопросы:
- Было бы целесообразно / рекомендовано использовать
boost::multi_array
для n-мерного массива,или я должен вместо этого попытаться использовать Eigen? - Должны ли я иметь отдельные функции для одномерных / двумерных случаев или просто абстрагировать все это в многовариантный случай с использованием boost :: multi_array (или соответствующей альтернативы)?