Я завернул это в класс расширений, который позволяет вам называть:
myDataTable.WriteToCsvFile("C:\\MyDataTable.csv");
на любом DataTable.
public static class DataTableExtensions
{
public static void WriteToCsvFile(this DataTable dataTable, string filePath)
{
StringBuilder fileContent = new StringBuilder();
foreach (var col in dataTable.Columns)
{
fileContent.Append(col.ToString() + ",");
}
fileContent.Replace(",", System.Environment.NewLine, fileContent.Length - 1, 1);
foreach (DataRow dr in dataTable.Rows)
{
foreach (var column in dr.ItemArray)
{
fileContent.Append("\"" + column.ToString() + "\",");
}
fileContent.Replace(",", System.Environment.NewLine, fileContent.Length - 1, 1);
}
System.IO.File.WriteAllText(filePath, fileContent.ToString());
}
}
Пусть S - положительно определенная матрица. Следовательно, S имеет разложение Холецкого L.L '= S, где L - нижнетреугольная матрица, а '
обозначает транспонирование матрицы, а .
обозначает умножение матрицы. Пусть x взят из гауссовского распределения со средним нулем и ковариацией, равной единице матрицы Тогда y = L.x имеет гауссово распределение со средним нулем и ковариацией S.
Итак, если вы можете найти подходящие ковариационные матрицы A и B, вы можете использовать их разложения Холецкого для генерации выборок. Теперь о построении матрицы, которая имеет собственные значения, следующие заданному распределению. Мой совет - начать со списка образцов из экспоненциального распределения; это будут ваши собственные значения. Пусть E = матрица с показательными выборками по диагонали и нулями в противном случае. Пусть U - любая унитарная матрица (т.е. столбцы ортогональны, а норма каждого столбца равна 1). Тогда U.E.U 'является положительно определенной матрицей с указанными собственными значениями.
U может быть любой унитарной матрицей. В частности, U может быть единичной матрицей. Это может сделать все остальное проще; вам нужно проверить, подходит ли U = identity для проблемы, над которой вы работаете.