我正在爲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
原來是(對我來說)最好的解決方案之一...... –