Matlab笔记04变数变量与档案存取

数据类型与档案存取

数值类型

  1. 在MATLAB中,数值类型的变量被默认为double类型的,可以使用类型转换将其转换为其他数值类型.

  2. Matlab的数据类型是当作函数使用的

    eg.

    ​ n = 3;
    ​ class(n) % 得到 double

    ​ n = int8(3);
    ​ class(n) % 得到 int8

    (class函数用来显示变量类型)

  3. 数值类型描述
    double双精度浮点数
    single单精度浮点数
    int88位带符号整数
    int1616位带符号整数
    int3232位带符号整数
    int6464位带符号整数
    uint88位无符号整数
    uint1616位无符号整数
    uint3232位无符号整数
    uint6464位无符号整数

字符串类型

  1. char类型

    在MATLAB中,字符串类型由一对单引号'包裹一段文字来定义.标准ASCII字符可以被转换为对应的ASCII码.

    eg.

    s1 = 'h';
    uint16(s1)	% 得到 104
    
  2. string类型

    字符串在内存中是以字符矩阵的形式存储的,可以对其进行矩阵的索引以及赋值操作:

    下面这个例子可以形象的理解以矩阵形式存储的字符串

    str1 = 'hello';
    str2 = 'world';
    
    str3 = [str1 str2];
    size(str3)		% 得到 [1 10]
    
    str4 = [str1; str2];
    size(str4)		% 得到 [2 5]
    
  3. string类型的数据处理

    对string类型变量进行赋值与比较处理时,matlab会依次与各个string矩阵的元素进行比较和赋值

    eg.

    str = 'aardvark';
    'a' == str				% 得到 [1 1 0 0 0 1 0 0]
    str(str == 'a') = 'Z'	% 得到 'ZZrdvZrk'
    

结构体(structure)

  1. matlab会自动把’variable.变量名’识别成结构体.

    student.name = 'John Doe';
    student.id = 'jdo2@sfu.ca';
    student.number = 301073268;
    student.grade = [100, 75, 73; ...
                  95, 91, 85.5; ...
                  100, 98, 72];
    student
    
  2. 对结构体列表使用下标表达式可以扩充或缩减结构体列表.

    student(2).name = 'Ann Lane';
    student(2).id = 'aln4@sfu.ca';
    student(2).number = 301078853;
    student(2).grade = [95 100 90; 95 82 97; 100 85 100];
    student
    
    student(1) = []		% 删除student列表第一项
    

结构体数组

  1. 结构体可以级联,即结构体中字段的取值也可以是结构体:

    A = struct('data', [3 4 7; 8 0 1], ...
    	'nest', struct('testnum', 'Test 1', ...
         'xdata', [4 2 8], ...
         'ydata', [7 1 6]));
    A(2).data = [9 3 2; 7 6 5];
    A(2).nest.testnum = 'Test 2';
    A(2).nest.xdata = [3 4 2];
    A(2).nest.ydata = [5 0 9];
    
    A
    

结构体的级联

  1. 结构体的常用函数
函数作用
struct创建结构体
struct2cell将结构体转换为元胞数组
cell2struct将元胞数组转换为结构体
isstruct判断某变量是否是结构体
structfun对结构体的每个字段都应用某函数
fieldnames获取结构体的所有字段名
isfield判断结构体是否包含某字段
getfield获取结构体某字段的值
setfield为结构体中的某字段赋值
rmfield删除结构体中的某字段(删除字段而不是把字段内容清空)
orderfields为结构体字段排序

元胞数组(cell)

  1. 在MATLAB中,元胞数组是一个可以容纳不同类型元素的数据结构,类似于Python语言中的列表.

  2. 我们可以使用{}像定义矩阵一样定义元胞数组:

    ​ 第一种方式定义

    A = { [1 4 3; 0 5 8; 7 2 9]	 'Anne Smith' ;3+7i    -pi:pi:pi}
    

    ​ 第二种方式定义

    > A(1,1)={[1 4 3; 0 5 8; 7 2 9]};
    > A(1,2)={'Anne Smith'};
    > A(2,1)={3+7i};
    > A(2,2)={-pi:pi:pi};
    > A
    

    ​ 第三种方式定义

    > A{1,1}=[1 4 3; 0 5 8; 7 2 9];
    > A{1,2}='Anne Smith';
    > A{2,1}=3+7i;
    > A{2,2}=-pi:pi:pi;
    > A
    

    上面三种方式是等价的,其中第二种方式使用单元索引赋值,而第三种方式使用内容索引赋值.

  3. 有两种方式访问元胞数组中的数据,分别是: 单元索引()内容索引{}.

    因为元胞数组的子集仍为元胞数组,在索引器内容的使用,我们有必要指明我们要访问的的是一个子元胞数组还是元胞数组对应区域中的内容.

    • 使用单元索引(),我们得到的是一个子元胞数组.
    • 使用内容索引{},我们得到的是元胞数组对应区域中的内容.

    eg1.

    	A={'a','b'};	 %A是一个元胞数组
    
    ​	A(1)='a';		 %得到了一个子元胞数组
    
    ​	A{1}=a;		   %得到了一个元胞数组的内容
    

    eg2.

    B{1,1}='This is the first cell';
    B{1,2}=[5+j*6 4+j*5];
    B{2,1}=[1 2 3;4 5 6;7 8 9];
    B{2,2}={'Tim','Chris'};
    
    %执行结果
    
    B(1,2)={1×2 double}
    
    B(2,2)={1×2 cell  }
    
    B{1,2}=5.0000 + 6.0000i   4.0000 + 5.0000i
    
    B{2,2}={'Tim'}    {'Chris'}
    
  4. 元胞数组的常用函数

    函数作用
    cell创建一个元胞数组
    iscell判断某变量是否为元胞数组
    cell2mat将元胞数组转为矩阵
    cell2struct将元胞数组转为结构体
    mat2cell将数组转换为指定大小元胞数组
    num2cell将数组转换为相同大小的元胞数组
    struct2cell将结构体转换为元胞数组
    celldisp递归显示元胞数组中的内容
    cellplot以图像形式绘制元胞数组的结构
    cellfun对元胞数组的每个元胞应用某函数

    其中mat2cell用法

    a = magic(3) 
    
    b = num2cell(a) 
    
    % 得到
    
    % [8] [1] [6] 
    
    % [3] [5] [7] 
    
    % [4] [9] [2] 
    
    c = mat2cell(a, [1 2], [2, 1]) 
    
    % 得到 
    
    % [1x2 double] [6] 
    
    % [2x2 double] [2x1 double]
    

    mat2cell(a,X,Y);其中X,Y一般是两个1xn的矩阵的形式,代表分解的尺度,X拆解行数,Y拆解列数

    eg.

    c = mat2cell(x, [10, 20, 30], [25, 25])

    image_1d74j33fjob71lf1kvt137padu13.png-6kB

  5. 高维元胞数组

    • 一个三维的元胞数组可以有(row),(column),(layer)三个维度.在对元胞数组进行索引时,优先级从高到低的顺序分别是: 行→列→层.

    • A{X,Y,Z};X,Y,Z分别代表行,列,层三个维度

    • 使用cat函数可以在指定维度对元胞数组拼接

      cat(a,A,B);

      其中a=1/2/3,A与B为两个元胞数组

      1代表在行的维度拼接

      2代表在列的维度拼接

      3代表在层的维度拼接

    • reshape()指令可以让矩阵(元胞数组)重新排列

      可以把一个size(A)=(row1,colum1)的A矩阵

      转化为一个size(B)=(row2,colum2)的B矩阵

      只 须 满 足 r o w 1 ∗ c o l u m 1 = r o w 2 ∗ c o l u m 2 只须满足row1*colum1=row2*colum2 row1colum1=row2colum2

  6. 判断变量数据类型的函数

函数作用
isinteger判断输入参数是否为整型数数组
islogical判断输入参数是否为逻辑量数组
isnumeric判断输入参数是否为数值数组
isreal判断输入参数是否为实数数组
ischar判断输入参数是否为字符数组
iscell判断输入参数是否为元胞数组
isfloat判断输入数组是否为浮点数组
ishandle判断输入数组是否有效的图形句柄
isempty判断输入数组是否为空
isprime确定哪些数组元素为质数
isnan确定哪些数组元素为NaN
isinf确定哪些数组元素为Inf
isequal判断数组是否相等

文件读写

  1. matlab支持的文件类型

    文件内容扩展名读取文件的函数写入文件的函数
    MATLAB数据*.matloadsave
    Excel表格*.xls, *.xlsxxlsreadxlswrite
    空格分隔的数字*.txtloadsave

    save函数的语法如下:

    • save(filename,variables)将变量variables以二进制形式存入文件中.(这里其实是matlab把文件做了一个压缩)
    • save(filename,variables,'-ascii')将变量variables以文本形式存入文件中.

    load函数的语法如下:

    • load(filename)从二进制形式文件中读取数据.
    • load(filename,'-ascii')从文本形式文件中读取数据.

    其中参数filenamevariables都是字符串格式,若不指定variables参数,则将当前工作区(work space)内所有变量存入文件中.

    复杂的数据格式,如structcell,不支持以二进制格式存储.

  2. 读写Excel表格(不建议用xlsread与xlswrite读写表格)

    使用xlsreadxlswrite函数可以读写Excel数据,语法如下:

    • 读取Excel文件的语法:

    [num,txt,raw]= xlsread(filename,sheet,xlRange)

    Score = xlsread('04Score.xlsx')	
    %读取04core.xlsx中的第一个表格
    Score = xlsread('04Score.xlsx', 'B2:D4')
    %读取%读取04core.xlsx中从B2到D4矩形区域的表格
    [Score Header] = xlsread('04Score.xlsx')
    
    
    • 写入Excel的语法:

    xlswrite(filename,A,sheet,xlRange)

    M = mean(Score);
    xlswrite('04Score.xlsx', M, 1, 'E2:E4');
    xlswrite('04Score.xlsx', {'Mean'}, 1, 'E1');
    
  3. 由于xlsread与xlswrite的兼容性不足

    因此现在我们多用

    readtablereadmatrixreadcell进行读取表格

    writetablewritematrixwritecell进行写入表格


written by 田阴
update on 7/10/2020
参考ncepu_Chen大大的blog与自己总结完成
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值