JAVA調用matlab程序 輸入輸出數據轉換
- JAVA 程序調用 matlab函數(matlab導出jar包里的函數)、JAVA解析matlab返回數據時,機器需要先安裝matlab運行時環境 并 在java工程中導入運行時環境提供的javabuilder.jar用于數據類型的轉換。
- java工程中導入從matlab導出的jar文件。
函數調用
a. 傳入函數的JAVA變量先轉換為運行時環境里的對象
例如:JAVA double對象轉 matlab double對象(傳入函數的實際是運行時環境提供的中間類型)
double params= 0.2d;
MWNumericArray p1 = new MWNumericArray(params, MWClassID.DOUBLE);
b. 函數調用
//封裝實參為函數接受的類型
Object[] inputs = new Object[5];
MWNumericArray p1 = new MWNumericArray(params, MWClassID.DOUBLE);
input[1]=p1;
····
//實例化matlab函數入口對象,調用函數
//傳入的第一個參數是指定函數返回值數量(必須嚴格和實際返回值數量一致),第二個參數開始是實參列表(本例中實參封裝為Object數組傳入)
//函數返回 在Object數組 result 中
ClassSimple simple= new ClassSimple();
Object[] result = simple.XXXX(5, inputs);
matlab函數返回數據解析
目前,項目使用到并成功實現轉換的數據類型有 元胞數組、雙精度型數據、字符型數據。 最小粒度的數據為雙精度型數據、字符型數據,經過元胞數組的封裝和嵌套 返回。轉換過程中,確認不能轉換的數據類型有 table、日期時間型、日期長度型、時間日期向量。
Object res1= result[0];
//先將數據類型強制類型轉換為MWCellArray
MWCellArray cellArray = (MWCellArray) res1;
//cellArray.numberOfElements() 獲取元胞數組中元素總個數
//MWCellArray 相當于把表格數據縱向一維展開, 每一列的數據是相連的 而封裝java對象要抽出一行的數據
//元素總個數除以列數(表具有的字段數)得到行數
int rowNum= cellArray.numberOfElements() / columnNum;
for (int i = 1; i <= rowNum; i++) {
Bean bean= new Bean();
//解析字符型數據
bean.setName(String.valueOf(((char[][]) cellArray.get(i))[0]));
//解析雙精度型數據
bean.setWeight(((double[][]) cellArray.get(rowNum+ i))[0][0]);
System.err.println(bean);
}
- 字符型數據的轉換
確認元胞數組 cellArray 的第i 個元素對應字符型數據(可以先輸出第i個元素的類名查看 字符型數據對應的Class的SimpleName為char[][])后,
通過
String.valueOf(((char[][]) cellArray.get(i))[0]);
轉換為String;
- 雙精度型數據的轉換
確認元胞數組cellArray 的第j 個元素對應雙精度型數據(對應SimpleName為double[][])后,
通過
((double[][]) cellArray.get(j))[0][0];
即可取出該位置的數據;
- 元胞數組嵌套時的數據轉換
確認元胞數組cellArray 的第k個元素為元胞數組類型(對應SimpleName為MWArray)后,
通過
MWArray array= cellArray.getCell(k);
即可取出該位置的元胞數組,再次解析即可,例如:
for (int j = 1; j <= array.numberOfElements(); j++) {
String.valueOf(((char[][]) array.get(j))[0]);
}
注意事項:
1. 運行時環境里的元胞數組 **下標從1開始** 下標為0 報錯;
2. MWCellArray 相當于把表格數據縱向一維展開, 每一列的數據是相連的 而封裝java對象要抽出一行的數據;
3. 成功實現轉換的數據類型有 元胞數組、雙精度型數據、字符型數據; 確認不能轉換的數據類型有 table、日期時間型、日期長度型、時間日期向量;
4. 從元胞數組中獲取元胞數組是使用cellArray.getCell(),使用cellArray.get()有時候報錯。