【问题标题】:Fast Matlab Matrix to Java List conversion快速 Matlab 矩阵到 Java 列表的转换
【发布时间】:2017-06-16 15:04:15
【问题描述】:

我必须在 Matlab 中将 131072x1 int32 类型的矩阵中的数据按摩到 Java List<Integer> 中。到目前为止,我想出的唯一可行的转换是遍历值并将它们直接添加到 LinkedList。

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

这在极端情况下很慢(5 秒)。我尝试了几种先转换为 Java 数组然后再转换为 List 的公式,但我总是得到一个 1 列和 131072 行的数组。

我需要一种快速将 N×1 Matlab 的 int32 矩阵分配给 Java List<Integer> 类型的方法。

【问题讨论】:

  • 我引用 Matlab 文档“传递对象数组要调用具有定义为 java.lang.Object 或 java.lang.Object 数组的参数的方法,请传递 Java 数组或 MATLAB “链接:in.mathworks.com/help/matlab/matlab_external/… 这建议可以帮助您从那里获取一个 java 数组,您可以将其转换为列表
  • @KaranSharma 我已经做到了。自动转换创建一个单列多行数组,从它创建的 List 是相同的。即使转置数组也无济于事,它仍然会创建一个包含列中所有值的单个元素列表。

标签: java matlab


【解决方案1】:

转换为单元格

我发现让 Matlab 以我想要的方式运行的一种方法是将矩阵转换为单元格。

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

它比滚动数组并附加到列表要快,但仍然太慢。平均每次转化需要 0.25 秒,这更好,但仍然太高。

Java 8 流

经过一些研究和测试,在 Java 中实现一个函数以在合理的时间(0.001 秒)内处理从 int[]List<Integer> 的转换。

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

要使用 Java 8,您需要将 MATLAB_JAVA 环境变量指向较新的 JRE。在 Mac 上使用 java_home 可以找到 JRE 的位置。

/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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 2013-03-26
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多