1

double の配列を含む多数のセル型オブジェクトを含むMATLABで作成された配列があります。これは基本的に <1xn cell> 配列で、各セルは double の配列です。

私がやりたいことは、これらを何とかエクスポートして、データを int 型の配列の不規則な配列として Java に挿入できるようにすることです。これを行う最善の方法について何か考えはありますか?

4

2 に答える 2

2

MatlabはMatlab配列にオートボックス化することを望んでいるため、MatlabでプリミティブのJava配列を構築することは困難です。

できることは、メソッドシグネチャを使用してMatlabのオートボクシングをガイドするJavaクラスを作成することです。このようなラッパーレイヤーは、テキストエクスポートのラウンドトリップよりも高速で便利な場合があります。

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配列に戻すためです。Mコード内でObject[]として保持すると、保護されます。

同様のラッパーを使用して、リストまたは他のコレクションを作成することもできます。これは他のJavaコードとうまく調和する可能性があり、コレクションはMatlabで箱から出されません。

于 2009-11-20T15:24:09.797 に答える
0

MATLAB ではなく Java で作業したいので、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 に答える