Я создаю интерфейсный слой для компонента Matlab, который используется для анализа данных, поддерживаемых отдельным приложением .NET, которое я также строю. Я пытаюсь сериализовать данные .NET в виде числового массива для передачи в компонент MATLAB (как часть более обобщенной процедуры сериализации).
До сих пор я был достаточно успешным с передачей таблиц числовых данных, но столкнулся с проблемой при попытке добавить столбец типа данных DateTime
. То, что я делал до сих пор, - это вставка значений из DataTable
в двойной массив, потому что MATLAB действительно заботится только о двойных значениях, а затем выполняет прямое приведение к MWNumericArray
, что по сути является матрицей.
Вот текущий код;
else if (sourceType == typeof(DataTable))
{
DataTable dtSource = source as DataTable;
var rowIdentifiers = new string[dtSource.Rows.Count];
// I know this looks silly but we need the index of each item
// in the string array as the actual value in the array as well
for (int i = 0; i < dtSource.Rows.Count; i++)
{
rowIdentifiers[i] = i.ToString();
}
// convenience vars
int rowCount = dtSource.Rows.Count;
int colCount = dtSource.Columns.Count;
double[,] values = new double[rowCount, colCount];
// For each row
for (int rownum = 0; rownum < rowCount; rownum++)
{
// for each column
for (int colnum = 0; colnum < colCount; colnum++)
{
// ASSUMPTION. value is a double
values[rownum, colnum] = Conversion.ConvertToDouble(dtSource.Rows[rownum][colnum]);
}
}
return (MWNumericArray)values;
}
Conversion.ConvertToDouble
- это моя собственная подпрограмма, которая обслуживает NULLS, DBNull и возвращает double.NaN, опять же, потому что Matlab обрабатывает все NULLS как NaN.
Так вот в чем дело; Кто-нибудь знает тип данных MATLAB, который позволил бы мне передавать непрерывный массив с несколькими типами данных? Единственный обходной путь, который я могу придумать, заключается в использовании MWStructArray
из MWStructArrays
, но это кажется хакерским, и я не уверен, насколько хорошо это будет работать в коде MATLAB, поэтому я хотел бы попытаться найти более элегантный Решение, если я могу. Я рассмотрел использование MWCellArray
, но при попытке его создания я получаю ошибку компиляции.
Я хотел бы иметь возможность сделать что-то вроде;
object[,] values = new object[rowCount, colCount];
// fill loosely-typed object array
return (MWCellArray)values;
Но, как я уже сказал, я получаю ошибку компиляции, в том числе и при передаче массива объектов в конструктор.
Извиняюсь, если я что-то глупо пропустил. Я немного погуглил, но информация о интерфейсах Matlab to .NET кажется немного легкой, поэтому я разместил ее здесь.
Заранее спасибо.
[EDIT]
Спасибо всем за предложения.
Оказывается, что самым быстрым и эффективным способом для нашей конкретной реализации было преобразование Datetime в int в коде SQL.
Однако из других подходов я бы рекомендовал использовать подход MWCharArray. Он использует наименьшее количество суеты, и оказывается, что я просто делал это неправильно - вы не можете относиться к нему как к другому типу MWArray, поскольку он, конечно, предназначен для работы с несколькими типами данных, которые вам нужно перебирать, вставляя в MWNumerics все, что вам нравится на ходу. Следует помнить, что MWArrays основаны на 1, а не на 0. Тот продолжает меня преследовать.
Я более подробно остановлюсь сегодня, когда у меня будет время, а сейчас нет. Спасибо всем еще раз за вашу помощь.