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