2.7 不同数据类型之间的转化

MATLAB中为用户提供了丰富的数据类型,用户可以根据实际问题的需要创建不同数据类型的变量,同时MATLAB也提供了各种函数用于不同类型数据之间的转换。下面将详细介绍不同数据类型之间常有的转化。

1.数值类型的互相转换

数据类型的转换与不同数值类型变量定义的格式相同,如x2=class(x1),其中x1为原数据类型的数据,x2为转换后数据类型的数据,class为转换的数据类型。可以转换的数据类型包括所有的数值类型,有双精度、单精度浮点型,16位、32位、64位无符号整型数据,16位、32位、64位有符号整型数据等。

【例2.27】数值类型的互相转换。

>> x=32;  %定义数值类型数据x,默认状态下为双精度浮点型
>> x1=single(x); %转换双精度浮点型数据为单精度浮点型数据
>> x2=uint8(x); %转换双精度浮点型数据为无符号8位整型数据
>> x3=int8(x); %转换双精度浮点型数据为有符号8位整型数据
>> whos  %查看各变量的数据类型
  Name   Size            Bytes Class
  x     1x1             8 double array
  x1    1x1             4 single array
  x2    1x1             1 uint8 array
  x3    1x1             1 int8 array
Grand total is 4 elements using 14 bytes
2.字符串与数值类型的互相转换

字符串与数值类型的互相转换包括数组与字符串的转换,1~127的ASCII码值转换为字符,还有不同进制数据之间的转换等。

数组与字符串的转换通过num2str()和str2num()函数实现,具体的函数用法如下。

● str = num2str(A):把数值型数据数组A转换为字符型数据,默认情况下转换的数据精度为5位有效数字。

● str = num2str(A,precision):按照指定的数据精度转换数组A到字符串类型数据str,precision为字符串中数据的有效位数。

● str = num2str(A,format):按照指定的数据格式转换数组A到字符串类型数据str。format的书写格式为%m1.m2g/f/e,其中m1指定总共显示的有效数字位数,m2代表小数点后的有效数字位数,“g”格式代表用指数或定点标记,“e”格式代表用指数标记,“f”格式代表用定点标记,与函数sprinf()的输出显示设置相同。

● x = str2num('str'):字符串转化为数组。

【例2.28】字符串与数值类型的互相转换

>> a=rand(3); %生成随机矩阵a
>> s=num2str(a) %数组a转换为字符串s
s =
0.95013   0.48598   0.45647
0.23114   0.8913  0.018504
0.60684   0.7621   0.82141
>> s=num2str(a,3) %数组a转换为字符串s,保留小数点后3位
s =
0.95   0.486   0.456
0.231   0.891  0.0185
0.607   0.762   0.821
>> s=num2str(a,'%3.2e') %转换为字符串s,保留3位有效数字,小数点后留2位,以指数形式输出
s =
9.50e-0014.86e-0014.56e-001
2.31e-0018.91e-0011.85e-002
6.07e-0017.62e-0018.21e-001
>> s=num2str(a,'%3.2g') %转换为字符串s,保留3位有效数字,小数点后留2位,以“g”格式输出
s =
0.950.490.46
0.230.890.019
0.610.760.82
>> s=num2str(a,'%3.2f') %转换为字符串s,保留3位有效数字,小数点后留2位,以“f”格式输出
s =
0.950.490.46
0.230.890.02
0.610.760.82

另外,int2str()函数和str2int()函数可以完成整型数据与字符串的转换,即取整数据与字符串的转换。mat2str()函数和str2mat()函数可以实现矩阵与字符串的转换,其用法类似于num2str()函数和str2num()函数,但不可以用于高维数组,可以参见MATLAB的帮助文档。

ASCII码值与字符之间的转换通过char()函数和abs()函数来实现。

【例2.29】ASCII码值与字符之间的转换。

>> abs('A') %字符转换为ASCII码值
ans =
   65
>> char(65)  % ASCII码值转换为字符
ans =
A
>> char([65:127]) %多个ASCII码值转换为字符
ans =
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

MATLAB中还提供了一些函数用于不同进制数据之间的转换,其中涉及十进制数与其他各进制数字符串之间的转换,主要涉及的函数如下。

● dec2hex(x)和hex2dec(x):用于十六进制数和十进制数之间的相互转换。

● dec2bin(x)和bin2dec(x):用于二进制数和十进制数之间的相互转换。

● str = dec2base(d,base)和d = base2dec('strn',base):用于任意进制的数与十进制数之间的转换。

【例2.30】不同进制数据之间的转换。

>> s=dec2hex(59) %十进制数59转换为十六进制数
s =
3B
>> n=hex2dec('1B') %十六进制数“1B”转换为十进制数
n =
    27
>> s=dec2bin(19) %十进制数19转换为二进制数
s =
10011
>> n=bin2dec('100011') %二进制数“100011”转换为十进制数
n =
    35
>> s=dec2base(33,8) %十进制数33转换为八进制
s =
41
>> n=base2dec('222',8) %十进制数“222”转换为十进制
n =
  146
3.元胞数组与数值类型的互相转换

元胞数组与数值类型的互相转换通过num2cell()函数来实现,具体用法如下。

● c = num2cell(A):转换数组A到元胞数组c。

● c = num2cell(A,dims):按照指定的维数转换数组A到元胞数组c。

【例2.31】元胞数组与数值类型的互相转换。

>> A=magic(3)
A =
    8   1   6
    3   5   7
    4   9   2
>> num2cell(A)  %转换数组A到元胞数组
ans =
    [8]  [1]  [6]
    [3]  [5]  [7]
    [4]  [9]  [2]
>> num2cell(A,[1,9]) %按指定维数转换数组A到元胞数组
ans =
    [3x1 double]  [3x1 double]  [3x1 double]
4.字符串、元胞数组、结构体之间的互相转换

函数char和cellstr用于元胞数组和字符串之间的转换;函数cell2struct和struct2cell可用于元胞数组和结构体的转换。下面以实例来具体演示这些函数的使用。

【例2.32】字符串、元胞数组、结构体之间的互相转换。

>> str2CELL=cellstr({'abc', 'def';'ABC','DEF'}) %字符串转换为元胞数组
str2CELL =
    'abc'  'def'
    'ABC'  'DEF'
>> class(str2CELL)
ans =
cell
>> cell2str=char(Str2cell)   %元胞数组转换为字符串
cell2str =
abc
ABC
def
DEF
>> class(cell2str)
ans =
char
>> c2s=cell2struct(str2CELL,'A',4)  %元胞数组转换为结构体
c2s =
2x2 struct array with fields:
    A
>> class(c2s)
ans =
struct
>> s2c=struct2cell(c2s)   %结构体转换为元胞数组
s2c(:,:,1) =
    'abc'  'ABC'
s2c(:,:,2) =
    'def'  'DEF'
>> class(s2c)
ans =
cell