2009-11-12 65 views
1

我有一個在MATLAB中創建的數組,其中包含許多包含雙精度數組的單元類型對象。 它基本上是一個< 1xn cell>數組,每個單元格是一個雙精度數組。MATLAB:從MATLAB到Java獲取單元陣列

我想要做的是以某種方式導出這些數據,以便我可以將數據作爲int類型的數組的不規則數組插入到Java中。任何想法如何最好地做到這一點?

回答

2

這是很難建立在Matlab原語的Java數組,因爲Matlab的希望autobox它放回一個Matlab陣列。

你可以做的是創建一個Java類來幫助你,使用方法簽名來指導Matlab的自動裝箱。像這樣的包裝層可能比通過文本導出的往返更快,更方便。

package test; 

/** 
* Class to help build Java arrays from Matlab. 
*/ 
public class JavaArrayBuilder { 
    /** 
    * Assign an array into a larger ragged array 
    * @param array ragged array you're building 
    * @param i index into array 
    * @param subarray this gets autoboxed to int[] from Matlab 
    */ 
    public static void assignIntArray(Object[] array, int i, int[] subarray) { 
     array[i] = subarray; 
    } 
} 

然後,你可以從這樣的Matlab調用它。

function ja = build_int_array 

mynums = { 1:2, 1:5, 1:7 }; 
% Create a Java array of arrays 
dummy = java.lang.Object(); 
ja = java.lang.reflect.Array.newInstance(dummy.getClass(), numel(mynums)); 
for i = 1:numel(mynums) 
    test.JavaArrayBuilder.assignIntArray(ja, i-1, mynums{i}); 
end 
% Now you have a Java ragged array, albeit as Object[] instead of int[][] 

之後,您需要將對象[]數組轉換爲Java內部INT [] [],因爲Matlab的拆箱會以Java int [] []回Matlab的陣列。將其保存爲M代碼中的Object []可以保護它。

您也可以使用類似的包裝來構建List或其他Collection。這可能會與其他Java代碼更好地匹配,並且Collections不會在Matlab中取消裝箱。

+0

如果我有時間回到你身邊,我會在週末試試這個 – Bar 2009-11-21 12:06:10

0

嗯,我想從Java的工作,而不是MATLAB所以我所做的是我改編自西爾萬·費德勒cell2cvs代碼,並得到這個做它得到太陽能電池陣列工作並生成一個txt文件。

function cell2txt(datName,cellArray) 
% Writes cell array content into a *.txt file. 
% 
% CELL2CSV(datName,cellArray,seperator,excelVersion) 
% 
% datName  = Name of the file to save. [ i.e. 'text.csv' ] 
% cellarray = Name of the Cell Array where the data is in 
% 
%   by Sylvain Fiedler, KA, 2004 
% updated by Sylvain Fiedler, Metz, 06 
% fixed the logical-bug, Kaiserslautern, 06/2008, S.Fiedler 

seperator1 = ','; 
seperator2 = '\n'; 

datei = fopen(datName,'w'); 

for z=1:size(cellArray,1) 
    for s=1:size(cellArray,2) 

     var = eval(['cellArray{z,s}']); 

     if size(var,1) == 0 
      var = ''; 
     end 

     if isnumeric(var) == 1 
      var = num2str(var); 
      %fprintf(datei,seperator1); 
     end 

     fprintf(datei,var); 

     if s ~= size(cellArray,2) 
      fprintf(datei,seperator2); 

     end 
    end 
end 
fclose(datei); 

的後續問題here