You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:45:02