2017-06-15 100 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);