2017-06-15 103 views
1

我必須在Matlab中將類型爲131072x1 int32的矩陣中的數據轉換爲Java List<Integer>。到目前爲止,我提出的唯一工作轉換是滾動這些值並直接將它們添加到LinkedList。快速Matlab矩陣到Java列表轉換

count = size(data_flattened, 1); 
ll = java.util.LinkedList; 
for i = 1:count 
    ll.add(data_flattened(i)); 
end 

這是在極端(5秒)緩慢。我已經嘗試了幾種公式轉換爲Java數組,然後到List,但我總是以1列和131072行的數組結束。

我需要一種快速分配int32s的N×1的Matlab矩陣到Java List<Integer>類型的方法。

+0

我引用Matlab的文檔「對象 的傳遞數組要調用帶有參數的方法定義的Java .lang.Object或一個java.lang.Object數組,傳遞一個Java數組或一個MATLAB單元數組,MATLAB自動將單元數組元素轉換爲它們的Java類型,Java數組是Java構造函數返回的數組。也可以在MATLA中構建一個Java數組B使用javaArray函數「。鏈接:https://in.mathworks.com/help/matlab/matlab_external/passing-data-to-java-methods.html 這建議可以幫助你從那裏得到一個Java數組,你可以轉換成列表 –

+0

@ KaranSharma我已經做到了。自動轉換會創建一個單列多行數組,並且從它創建的列表是相同的。即使轉置數組也無濟於事,它仍會創建一個包含列中所有值的單個元素列表。 –

回答

0

轉換爲細胞

我發現越來越Matlab的表現我想要的方式的一種方式是將矩陣轉換爲細胞。

cells = num2cell(data_flattened);   
    the_list = java.util.Arrays.asList(cells) 

它比滾動數組和追加到列表還要快,但它仍然太慢。每次轉換的平均時間爲0.25秒,但效果會更好但仍然太高。

爪哇8流

經過一番研究和測試中的Java實現函數從int[]處理轉換到到List<Integer>在合理的時間(0.001秒)。

public static List<Integer> flatten(int[] arr) { 
    return IntStream.of(arr).parallel().boxed().collect(Collectors.toList()); 
} 

使用Java 8,你需要將自己的MATLAB_JAVA環境變量指向新的JRE。您的JRE的位置可以在Mac上使用java_home找到。

/usr/libexec/java_home 

然後在.bashrc或者類似

export MATLAB_JAVA="$(/usr/libexec/java_home)/jre" 

從終端啓動MATLAB現在將正確拾取新JRE。

在Matlab中,你可以檢查你的Java版本

version -java 

,然後在Matlab

matlab_data_flattened = matlab_data(:); 
java_list = com.my.package.ClassName.flatten(matlab_data_flattened);