Xamarin C#环境下多维float矩阵转Java.Lang.Object报错如何解决
问题解决方法
报错原因
C# 中的矩形数组(带逗号的多维数组,如float[,])是 .NET 独有的内存布局,Java 运行时没有对应类型映射,Java.Util.Arrays.FromArray无法将这类数组转换为Java可识别的结构,因此抛出类型转换异常。
Java的多维数组本质是嵌套的锯齿数组(数组的数组),和C#的[][][]结构完全对齐,你之前转换InputObj02用的就是锯齿数组结构,所以能正常运行。
解决方案1:改用锯齿数组构造输入
将InputObj01的输入改为三维锯齿数组结构,转换代码如下:
// 构造维度为[1,4000,2]的锯齿数组 float[][][] Input01 = new float[1][][]; Input01[0] = new float[4000][]; for (int i = 0; i < 4000; i++) { Input01[0][i] = new float[2]; // 此处填充你实际的矩阵数值,例: // Input01[0][i][0] = 你的第一个维度值; // Input01[0][i][1] = 你的第二个维度值; } // 转换为Java.Lang.Object var InputObj01 = Arrays.FromArray<float[][]>(Input01);
如果你原本的输入数据已经存在float[,]类型的矩形数组中,可以增加一步转换逻辑:
// 假设你已有填充好的矩形数组rawInput float[,] rawInput = new float[4000, 2]; float[][][] Input01 = new float[1][][]; Input01[0] = new float[4000][]; for (int i = 0; i < 4000; i++) { Input01[0][i] = new float[2] { rawInput[i, 0], rawInput[i, 1] }; } var InputObj01 = Arrays.FromArray<float[][]>(Input01);
解决方案2:使用FloatBuffer直接构造输入(性能更高)
TensorFlow Lite 原生支持直接传入Buffer类型作为输入,不需要嵌套数组转换,推理性能更好:
// 每个float占4字节,总元素数1*4000*2=8000,申请对应大小的直接缓冲区 var floatBuffer = ByteBuffer.AllocateDirect(8000 * 4) .Order(ByteOrder.NativeOrder()) .AsFloatBuffer(); // 按顺序写入矩阵数据 for (int i = 0; i < 4000; i++) { floatBuffer.Put(rawInput[i, 0]); floatBuffer.Put(rawInput[i, 1]); } floatBuffer.Rewind(); // floatBuffer本身就是Java.Lang.Object子类,可直接作为推理输入 var InputObj01 = floatBuffer;
内容的提问来源于stack exchange,提问作者matpa_
相关产品推荐
相关产品推荐

