double の配列を含む多数のセル型オブジェクトを含むMATLABで作成された配列があります。これは基本的に <1xn cell> 配列で、各セルは double の配列です。
私がやりたいことは、これらを何とかエクスポートして、データを int 型の配列の不規則な配列として Java に挿入できるようにすることです。これを行う最善の方法について何か考えはありますか?
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で箱から出されません。
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);
補足質問はこちら