目录
不同类的有效合并
只要矩阵中的所有元素属于同一类型,矩阵和数组可以由大多数 MATLAB® 数据类型的元素组成。如果在构造矩阵时纳入了不同类的元素,MATLAB 会转换一些元素,以使生成的矩阵中包含的所有元素都为同一类型。数据类型转换与预设的类优先级相关。下表显示了可以进行异类串联而不出错的 5 个类(字符和逻辑值间除外)。
| 类型 | 字符 | 整数 | 单精度值 | 双精度值 | 逻辑值 |
|---|---|---|---|---|---|
| 字符 | 字符 | 字符 | 字符 | 字符 | 无效 |
| 整数 | 字符 | 整数 | 整数 | 整数 | 整数 |
| 单精度值 | 字符 | 整数 | 单精度值 | 单精度值 | 单精度值 |
| 双精度值 | 字符 | 整数 | 单精度值 | 双精度值 | 双精度值 |
| 逻辑值 | 无效 | 整数 | 单精度值 | 双精度值 | 逻辑值 |
例如,串联 double 和 single 矩阵始终都会生成 single 类型的矩阵。MATLAB 将 double 元素转换为 single 以完成该过程。
合并不同的整数类型
如果在矩阵中合并不同的整数类型(例如有符号与无符号,或 8 位整数与 16 位整数),MATLAB® 将返回所有元素都属于一个公共类型的矩阵。MATLAB 将生成矩阵的所有元素设置为输入矩阵中的最左侧元素的数据类型。例如,以下串联生成由 3 个 16 位有符号整数组成的向量:
A = [int16(450) uint8(250) int32(1000000)]
合并不同大小的整数的示例
禁用如上所示的整数串联警告后,一次串联下面的两个数字,然后转换它们的顺序。返回值取决于整数的串联顺序。最左侧的类型决定着向量中的所有元素的数据类型:
A = [int16(5000) int8(50)]
A =
5000 50
B = [int8(50) int16(5000)]
B =
50 127
第一个操作返回由 16 位整数组成的向量。第二个操作返回由 8 位整数组成的向量。元素 int16(5000) 设置为127,即8位有符号整数的最大值。相同规则也适用于垂直串联:
C = [int8(50); int16(5000)]
C =
50
127
注:可以使用intmax和intmin函数查找任何 MATLAB 整数类型的最大值或最小值。对于浮点类型,用realmax和realmin
合并有符号与无符号整数的示例
现在使用有符号与无符号整数做相同的练习。同样,最左侧的元素决定着生成矩阵中的所有元素的数据类型:
A = [int8(-100) uint8(100)]
A =
-100 100
B = [uint8(100) int8(-100)]
B =
100 0
元素 int8(-100) 设为零,因为它不再有符号。MATLAB 在将每个元素串联为一个合并数组之前计算每个元素。换句话说,在合并两个元素前,以下语句的计算结果为一个 8 位有符号整数(等于 50)和一个 8 位无符号整数(无符号的 -50 设为零)。按照该串联,第二个元素保留其零值,但采用无符号 int8 类型:
A = [int8(50), uint8(-50)]
A =
50 0
合并整数与非整数数据
如果合并 double、single 或 logical 类的整数,将为生成矩阵的所有元素提供最左侧整数的数据类型。例如,以下向量的所有元素设置为 int32:
A = [true pi int32(1000000) single(17.32) uint8(250)]
合并元胞数组与非元胞数组
合并多个数组时,若其中有一个或多个为元胞数组,将返回一个新元胞数组。每个原始数组占用新数组中的一个元胞:
A = [100, {uint8(200), 300}, 'MATLAB'];
whos A
Name Size Bytes Class Attributes
A 1x4 477 cell
合并的数组中的每个元素都保持其原始类:
fprintf('Classes: %s %s %s %s\n',...
class(A{1}),class(A{2}),class(A{3}),class(A{4}))
Classes: double uint8 double char
串联示例
合并单精度与双精度类型值
合并single值与double值会生成single矩阵。请注意,5.73*10^300 太大,无法作为single存储,因此从double转换为single时将其设置为无穷大。(本示例中使用的class函数返回输入值的数据类型)。
x = [single(4.5) single(-2.8) pi 5.73*10^300]
x =
4.5000 -2.8000 3.1416 Inf
class(x) % Display the data type of x
ans =
single
合并整数与双精度类型值
合并整数值与double值会生成整数矩阵。请注意,pi 的小数部分舍入到最接近的整数。(本示例中使用的int8函数将其数值参数转换为一个 8 位整数)。
x = [int8(21) int8(-22) int8(23) pi 45/6]
x =
21 -22 23 3 8
class(x)
ans =
int8
合并字符与双精度类型值
合并character值与double值会生成character矩阵。MATLAB® 将本示例中的double元素转换为它们的character等效值:
x = ['A' 'B' 'C' 68 69 70]
x =
ABCDEF
class(x)
ans =
char
合并逻辑值与双精度类型值
合并 logical 值与double值会生成double矩阵。MATLAB 将本示例中的logicaltrue和false元素转换为它们的double等效值:
x = [true false false pi sqrt(7)]
x =
1.0000 0 0 3.1416 2.6458
class(x)
ans =
double
9082

被折叠的 条评论
为什么被折叠?



