我在MATLAB中创建了一个数组,其中包含许多包含双精度数组的单元类型对象。它基本上是一个 <1xn cell> 数组,每个单元格都是一个双精度数组。
我想要做的是以某种方式导出这些,以便我可以将数据作为 int 类型数组的参差不齐的数组插入到 Java 中。关于如何最好地做到这一点的任何想法?
在 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 中拆箱。
好吧,我想从 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);
后续问题在这里