我正在为Matlab组件构建一个接口层,该组件用于分析由我正在构建的独立.NET应用程序维护的数据。我试图将一个.NET数据表序列化为一个数组,作为一个数组传递给MATLAB组件(作为更广泛的序列化例程的一部分)。将.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
是我自己的日常迎合空值,为DBNull并返回double.NaN,又因为Matlab的对待所有NULLS为NaN的。
所以,这是事情;有谁知道一个MATLAB数据类型,这将允许我传入一个连续的数组与多个数据类型?我能想到的唯一解决方法包括使用MWStructArrays
的MWStructArray
,但这看起来很诡异,我不确定它在MATLAB代码中的工作情况如何,所以我想尝试找到更优雅的解决方案,只要我可以。我看了一下使用MWCellArray
,但是当我尝试实例化它时,它给了我一个编译错误。
我希望能够做到这样的事情;
object[,] values = new object[rowCount, colCount];
// fill loosely-typed object array
return (MWCellArray)values;
但正如我所说的,我得到一个编译错误与此,也传递一个对象数组到构造函数。
道歉,如果我错过了什么愚蠢的东西。我已经做了一些谷歌搜索,但关于Matlab到.NET接口的信息似乎有点亮,所以这就是我在这里发布它的原因。
在此先感谢。
[编辑]
感谢大家的建议。
原来,我们特定实现的最快和最有效的方法是将Datetime转换为SQL代码中的int值。
但是,在其他方法中,我建议使用MWCharArray方法。它使用最少的大惊小怪,事实证明我只是做错了 - 你不能像另一个MWArray类型那样对待它,因为它当然被设计为处理你需要遍历它的多个数据类型,坚持使用MWNumerics或者无论你在哪里都喜欢你。有一点需要注意的是MWArrays是基于1的,而不是基于0的。那个人一直把我赶出去。
我会在今天晚些时候进入更详细的讨论,但是现在我没有。再次感谢大家的帮助。
您是否试过显式创建一个新的MWCellArray(numRows,numCols),然后遍历嵌套for循环的对象集合,手动设置单元格数组的元素? – Matt
原来是(对我来说)最好的解决方案之一...... –