Matlab中不同类的有效合并

目录

不同类的有效合并

合并不同的整数类型

合并不同大小的整数的示例

合并有符号与无符号整数的示例

合并整数与非整数数据

合并元胞数组与非元胞数组

串联示例

合并单精度与双精度类型值

合并整数与双精度类型值

合并字符与双精度类型值

合并逻辑值与双精度类型值


不同类的有效合并

        只要矩阵中的所有元素属于同一类型,矩阵和数组可以由大多数 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

合并整数与非整数数据

        如果合并 doublesingle 或 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 将本示例中的logicaltruefalse元素转换为它们的double等效值:

x = [true false false pi sqrt(7)]
x =
    1.0000         0         0    3.1416    2.6458

class(x)
ans =
   double

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值