有效地将Java列表转换为Matlab矩阵

And*_*ean 4 java matlab protocol-buffers

我从Matlab调用Google Protocol Buffers Java API.这很好用,但我遇到了很大的性能瓶颈.大部分数据作为以下类型的对象返回:

java.util.Collections$UnmodifiableRandomAccessList
Run Code Online (Sandbox Code Playgroud)

它们实际上包含一个浮点列表.我需要将其转换为Matlab矩阵.到目前为止,我发现的最佳方法是致电:

cell2mat(cell(Q.toArray()))
Run Code Online (Sandbox Code Playgroud)

但是,这一行是代码中的巨大性能瓶颈.

注意我知道Google Protocol Buffers的FarSounder Matlab解析器生成器,遗憾的是这些生成器非常慢.请参阅下文,了解我的问题(YMMV)的一些粗略基准速度.高是好的.

  • Farsounder Matlab:0.03
  • 纯Python:1
  • 从Matlab调用的Java API(仅解析和提取元数据):10
  • 从Matlab调用的Java API(解析和提取元数据和数据):0.25

如果不是为了将转换java.util.Collections$UnmodifiableRandomAccessList 为Matlab矩阵的开销,那么从Matlab调用Java API的方法看起来很有希望.

有没有更好的方法将这个Java对象转换为Matlab矩阵?

请记住,返回此类型的方法是自动生成的代码.

Edr*_*ric 7

您可能最好编写一小段额外的Java代码,如下所示:

import java.util.List;
import java.util.ListIterator;

class Helper {
    public static float[] toFloatArray(List l) {
        float retValue[] = new float[l.size()];
        ListIterator iterator = l.listIterator();
        for (int idx = 0; idx < retValue.length; ++idx ){
            // List had better contain float values,
            // or else the following line will ClassCastException.
            retValue[idx] = (float) iterator.next();
        }
        return retValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到了:

>> j = java.util.LinkedList;
>> for idx = 1:1e5, j.add(single(idx)); end
>> tic, out = Helper.toFloatArray(j); toc
Elapsed time is 0.006553 seconds.
>> tic, cell2mat(cell(j.toArray)); toc
Elapsed time is 0.305973 seconds.
Run Code Online (Sandbox Code Playgroud)