1

我在MATLAB中创建了一个数组,其中包含许多包含双精度数组的单元类型对象。它基本上是一个 <1xn cell> 数组,每个单元格都是一个双精度数组。

我想要做的是以某种方式导出这些,以便我可以将数据作为 int 类型数组的参差不齐的数组插入到 Java 中。关于如何最好地做到这一点的任何想法?

4

2 回答 2

2

在 Matlab 中构造 Java 基元数组很困难,因为 Matlab 想将其自动装箱回 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 中将 Object[] 数组转换为 int[][],因为 Matlab 会将 Java int[][] 拆箱回 Matlab 数组。将它作为 Object[] 保存在 M 代码中可以保护它。

您还可以使用类似的包装器构建 List 或其他 Collection。这可能与您的其他 Java 代码更好地结合,并且集合不会在 Matlab 中拆箱。

于 2009-11-20T15:24:09.797 回答
0

好吧,我想从 Java 而不是 MATLAB 工作,所以我所做的是我改编了 Sylvain Fiedler 的 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);

后续问题在这里

于 2009-11-12T22:23:39.773 回答