主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用 Java 和 MATLAB 类型的数据转换

R2025b

使用 MATLAB 数据类型

在 MATLAB® 中您可以使用多种数据类型。这些数据类型都采用矩阵或数组的形式。您可以构建浮点和整数数据、字符和字符串以及逻辑真和假状态的矩阵和数组。结构和元胞数组提供了一种在同一数组中存储不同类型数据的方法。

所有基本 MATLAB 类均在图基本 MATLAB 数据类型中圈出。

Java® 客户端遵循 Java-MATLAB-Interface (JMI) 数据编组规则。它扩展了标量 Java 装箱类型的规则,允许自动装箱和拆箱,而 JMI 不支持这一点。

注意

MATLAB Production Server™ 不支持函数句柄。

基本 MATLAB 数据类型

Java 到 MATLAB 类型的预期转换结果在 Java 类型到 MATLAB 类型的转换 中列出。MATLAB 到 Java 类型的预期转换结果在 MATLAB 类型到 Java 类型的转换 中列出。

标量数值类型强制

只要没有数据或精度丢失,标量数值 MATLAB 类型就可以分配给多个 Java 数值类型。

该规则的主要例外是 MATLAB double 标量数据可以映射到任何 Java 数值类型。因为 double 是 MATLAB 中的默认数值类型,所以此例外为 MATLAB Production Server Java 客户端 API 的用户提供了更多的灵活性。

MATLAB 到 Java 数值类型兼容性 描述标量数值强制的类型兼容性。

MATLAB 到 Java 数值类型兼容性

MATLAB 类型Java 类型
uint8short, int, long, float, double
int8short, int, long, float, double
uint16int, long, float, double
int16int, long, float, double
uint32long, float, double
int32long, float, double
uint64float, double
int64float, double
singledouble
doublebyte, short, int, long, float

Java 和 MATLAB 数据类型中的维度

在 MATLAB 中,维数是基本类型的属性,并且不会像在 Java 中那样增加类型的数量。

Java、double、double[] 和 double[][][] 是三种不同的数据类型。在 MATLAB 中,只有 double 数据类型,并且可能有一个标量实例、一个向量实例或一个多维实例。

Java 签名从 MATLAB 返回的值
double[][][] foo() ones(1,2,3)

维度强制转换

如何定义 MATLAB 函数和相应的 Java 方法签名决定了是否强制输出数据(使用填充或截断)。

此强制操作是自动为您执行的。本节介绍填充和截断遵循的规则。

当 Java 方法的返回类型比 MATLAB 方法的返回类型具有更多维度时,MATLAB 维度将用 1 (1) 填充,以匹配 Java 中所需的输出维度数。

作为开发人员,您不需要做任何事情来填充尺寸。

下表提供了如何执行填充的示例:

MATLAB 如何填充 Java 方法返回类型

当 MATLAB 中的维度为:在 Java 中的维度为:在 Java 中为此类型:在 MATLAB 中返回此类型:
size(a) 为 [2,3]数组将以大小 2,3,1,1 的形式返回double [][][][] foo() function a = foo a = ones(2,3);

MATLAB 和 Java 数据转换中的填充维度

MATLAB 数组维度声明的输出 Java 类型输出 Java 维度
2 x 3double[][][]2 x 3 x 1
2 x 3double[][][][]2 x 3 x 1 x 1

当 Java 方法的返回类型的维度少于 MATLAB 方法的返回类型的维度时,MATLAB 维度将被截断以匹配 Java 中所需的输出维度数。仅当 MATLAB 数组的额外维度仅有 1 (1) 的值时才有可能。

为了计算 Java 中适当的维数,多余的维数将被截断,顺序如下:

  1. 从数组末尾

  2. 从数组的开头

  3. 从数组中间(从前到后扫描)。

作为开发人员,您不需要执行任何操作来截断维度。

下表提供了如何执行截断的示例:

MATLAB 如何截断 Java 方法返回类型

当 MATLAB 中的维度为:在 Java 中的维度为:在 Java 中为此类型:在 MATLAB 中返回此类型:
size(a) 为 [1,2,1,1,3,1]数组将以大小 2,3 的形式返回double [][] foo()function a = foo a = ones(1,2,1,1,3,1);

以下是使用 double numeric 类型缩短维度的一些示例:

MATLAB 和 Java 数据转换中的截断维度

MATLAB 数组维度声明的输出 Java 类型输出 Java 维度
1 x 1double0
2 x 1double[]2
1 x 2double[]2
2 x 3 x 1double[][]2 x 3
1 x 3 x 4double[][]3 x 4
1 x 3 x 4 x 1 x 1double[][][]1 x 3 x 4
1 x 3 x 1 x 1 x 2 x 1 x 4 x 1 double[][][][]3 x 2 x 1 x 4

空(零)维度

传递零维 (0) 数组(有时称为空)会导致 MATLAB 产生一个空矩阵。

Java 签名从 MATLAB 返回的值
double[] foo() []

当 null 从 Java 传递到 MATLAB 时,它将始终被编组为 MATLAB 中的 [],作为零乘零(0 x 0)双精度数。这与 Java 中使用的声明的输入类型无关。例如,以下所有方法都可以接受 null 作为输入值:

void foo(String input);
void foo(double[] input);
void foo(double[][] input);
void foo(Double input);

在 MATLAB 中,null 将被接收为:

[] i.e. 0x0 double

MATLAB 中的空数组至少在一维中分配有一个零 (0)。例如,对于 function a = foo,以下任何一个值都是可以接受的:

 a = []; 
 a = ones(0);
 a = ones(0,0);
 a = ones(1,2,0,3); 

对于上述所有情况,空的 MATLAB 数据将作为 null 返回给 Java。

例如,在 Java 中,当 MATLAB 函数返回空数组时,以下签名返回 null:

double[] foo();
double[][] foo();
Double foo();

但是,当 MATLAB 返回一个空数组并且 Java 中的返回类型是 scalar 原语(例如 double foo();)时,会引发异常。:

IllegalArgumentException
("An empty MATLAB array cannot be represented by a 
  primitive scalar Java type")

装箱类型

盒装类型用于封装不透明的 C 结构体。

如果在 Java 方法签名中使用盒装类型作为返回类型,则 Java 客户端将执行原始到盒装类型的转换。

Java 签名从 MATLAB 返回的值
Double foo()1.0

例如,以下方法签名可以互换使用:

double[] foo();         Double[] foo();
double[][][] foo();     Double[][][] foo();

Java 和 MATLAB 数据类型中的有符号类型和无符号类型

MATLAB 中的数字类包括有符号和无符号整数。Java 没有无符号类型。