我正在为 Matlab 组件构建接口层,该组件用于分析由我也在构建的单独 .NET 应用程序维护的数据。我正在尝试将 .NET 数据表序列化为要传递给 MATLAB 组件的数值数组(作为更通用的序列化例程的一部分)。
到目前为止,我在传递数字数据表方面相当成功,但是在尝试添加 datatype 列时遇到了障碍DateTime
。到目前为止,我一直在做的是将值从 填充DataTable
到双精度数组中,因为 MATLAB 只真正关心双精度数,然后直接转换为 a 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
of MWStructArrays
,但这似乎很老套,我不确定它在 MATLAB 代码中的效果如何,所以如果可以的话,我想尝试找到一个更优雅的解决方案。我看过使用MWCellArray
,但是当我尝试实例化它时它给了我一个编译错误。
我希望能够做类似的事情;
object[,] values = new object[rowCount, colCount];
// fill loosely-typed object array
return (MWCellArray)values;
但正如我所说,我得到了一个编译错误,也将一个对象数组传递给构造函数。
抱歉,如果我错过了任何愚蠢的事情。我做了一些谷歌搜索,但是关于 Matlab 到 .NET 接口的信息似乎有点轻,所以这就是我在这里发布它的原因。
提前致谢。
[编辑]
感谢大家的建议。
事实证明,对于我们的具体实现来说,最快和最有效的方法是在 SQL 代码中将 Datetime 转换为 int。
但是,在其他方法中,我建议使用 MWCharArray 方法。它使用最少的大惊小怪,事实证明我只是做错了 - 你不能把它当作另一种 MWArray 类型,因为它当然设计用于处理需要迭代它的多种数据类型,坚持使用 MWNumerics 或随心所欲,随心所欲。需要注意的一件事是 MWArrays 是基于 1 的,而不是基于 0 的。那个人一直在抓我。
我将在今天晚些时候有空的时候进行更详细的讨论,但现在我没有。再次感谢大家的帮助。