1. matlab数据类型
- 数字型默认为double,可以转换为其他数据类型
- 字符:0-255的ASCII码存储;可以把字符或者字符串转化为数字型(ASCII)
`s1 = 'h'
whos
uint16(s1)
- 字符串型:string 用字符数组表示;可以进行矩阵拼接。
`s1 = 'Example';
s2 = 'String';
s3 = [s1 s2]; %横向拼接
s4 = [s1; s2];%纵向拼接
2.逻辑运算符和赋值
- 许多数字和逻辑运算符都适用于字符串。
str = 'aardvark';
str(str == 'a') = 'Z'
str = ‘ZZrdvZrk’
strcmp(str,'ZZrdvZrk') %整个字符串进行比较
ans =
logical
- 小练习:
s1='I like the letter E' ;
>> s2=s1(end:-1:1)
s2 =
'E rettel eht ekil I'
>> s3=s1(length(s1):-1:1)
s3 =
'E rettel eht ekil I'
>> s4=reverse(s1)
s4 =
'E rettel eht ekil I'
3. 结构体
- 存储复合数据类型
- 通过.字段名 来访问字段
- 使用下标来增加或删减结构体列表
1.访问:
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
student =
包含以下字段的 struct:
name: 'John Doe'
id: 'jdo2@sfu.ca'
number: 301073268
grade: [3×3 double]
>> student.grade %访问
ans =
100.0000 75.0000 73.0000
95.0000 91.0000 85.5000
100.0000 98.0000 72.0000
>> student.grade(1,3)
ans =
73
- 增加列表数
>> 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×2 struct 数组:
name
id
number
grade
>> student.name
ans =
'John Doe'
ans =
'Ann Lane'
- 删除
student(1) = [] % 删除student列表第一项
student =
包含以下字段的 struct:
name: 'Ann Lane'
id: 'aln4@sfu.ca'
number: 301078853
grade: [3×3 double]
- 结构体函数:
function | explain |
---|---|
cell2struct | 把cell类型数组转化为结构体 |
fieldnames | 获取结构体的字段名 |
getfield | 获取结构体中具体的字段 |
isfield | 判断是否是结构体字段 |
isstruct | 判断是否为结构体 |
struct | 创建结构体 |
struct2cell | 把结构体转化为cell类型 |
structfun | 对结构体的每个字段都应用某函数 |
rmfield | 删除结构其中的某些字段 |
fieldnames(student)
ans =
4×1 cell 数组
{'name' }
{'id' }
{'number'}
{'grade' }
>> getfield(student,'name')
ans =
'Ann Lane'
rmfield(student,'id')
ans =
包含以下字段的 1×2 struct 数组:
name
number
grade
- 嵌套结构体
结构体的成员又是一个结构体
>> 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.nest
ans =
包含以下字段的 struct:
testnum: 'Test 1'
xdata: [4 2 8]
ydata: [7 1 6]
ans =
包含以下字段的 struct:
testnum: 'Test 2'
xdata: [3 4 2]
ydata: [5 0 9]
4.元胞数组(cell)
- 类似于python中的列表,可以存储不同数据类型
- 可以使用{}像定义矩阵一样定义元胞数组,并且可以包含不同数据类型
clear 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
A =
2×2 cell 数组
{3×3 double } {'Anne Smith'}
{[3.0000 + 7.0000i]} {1×3 double }
>> clear 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
A =
2×2 cell 数组
{3×3 double } {'Anne Smith'}
{[3.0000 + 7.0000i]} {1×3 double }
- 获取cell的元素
- 单元索引:()
-
得到的是一个子元胞数组.
- 内容索引:{}
-
得到的是元胞数组对应区域中的内容.
- cell函数
- num2cell()and mat2cell()
- mat2cell()可以将数组转换为可能具有不同元胞大小的元胞数组
- C = mat2cell(A,dim1Dist,…,dimNDist) 将数组 A 在元胞数组 C 中分为较小的数组。向量 dim1Dist,…dimNDist 指定如何划分行、列和更高维度的 A(如果适用)。
- C = mat2cell(A,rowDist) 将数组 A 划分为 n×1 元胞数组 C,其中 n == numel(rowDist)。
>> a = magic(3) %魔方矩阵
b = num2cell(a)%每个元素都转化为一个cell
c = mat2cell(a, [1 1 1], 3)%将a矩阵转换为cell:分为行数分为三块,其中一块一行;列数分为一块,其中一块三列。
a =
8 1 6
3 5 7
4 9 2
b =
3×3 cell 数组
{[8]} {[1]} {[6]}
{[3]} {[5]} {[7]}
{[4]} {[9]} {[2]}
c =
3×1 cell 数组
{1×3 double}
{1×3 double}
{1×3 double}
6. 多维元胞数组
- 三维的元胞数组可以有行(row),列(column),层(layer)三个维度.在对元胞数组进行索引时,优先级从高到低的顺序分别是: 行→列→层.
- 可以通过索引来创建
- 可以使用cat进行拼接
A{1,1} = [1 2;4 5];
A{1,2} = 'Name';
A{2,1} = 2-4i;
A{2,2} = 7;
B{1,1} = 'Name2';
B{1,2} = 3;
B{2,1} = 0:1:3;
B{2,2} = [4 5]';
C=cat(3, A, B)
2×2×2 cell 数组
C(:,:,1) =
{2×2 double } {'Name'}
{[2.0000 - 4.0000i]} {[ 7]}
C(:,:,2) =
{'Name2' } {[ 3]}
{1×4 double} {2×1 double}
- reshape() :改变数组形状,类似于python
A = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)}
C = reshape(A,1,4)
- 判断变量和变量状态
7.文件
1. 读写MATLAB格式的数据
- MATLAB工作区内的数据可以以*.mat格式保存在文件中.使用save函数将数据存入文件,使用load函数从文件中读取数据.
- save函数的语法如下:
- save(filename,variables)
-
将变量variables以二进制形式存入文件中.
- save(filename,variables,’-ascii’)将变量variables以文本形式存入文件中.
clear; a = magic(4);
save mydata1.mat
save mydata2.mat -ascii
- load函数的语法如下:
- load(filename)从二进制形式文件中读取数据.
- load(filename,’-ascii’)从文本形式文件中读取数据.
- 其中参数filename和variables都是字符串格式,若不指定variables参数,则将当前工作区内所有变量存入文件中.
- 复杂的数据格式,如struct和cell,不支持以二进制格式存储.
load('mydata1.mat')
load('mydata2.mat','-ascii')
2. 读写Excel表格
- 使用xlsread和xlswrite函数可以读写Excel数据,语法如下:
- 读取Excel文件的语法:[num,txt,raw] = xlsread(filename,sheet,xlRange)
- 读取Excel文件的语法:[num,txt,raw] = xlsread(filename,sheet,xlRange)
Score = xlsread('04Score.xlsx') %默认读取数字
Score = xlsread('04Score.xlsx', 'B2:D4')
M = mean(Score')';
xlswrite('04Score.xlsx', M, 1, 'E2:E4'); xlswrite('04Score.xlsx', {'Mean'}, 1, 'E1');
低层次文件输入输出
- 读取文件/写入文件都是以字符或者字节进行
- 一个文件必须有一个fid
- 文件中的坐标是通过一个一个可以移动的指针进行访问
- 函数功能:
x = 0:pi/10:pi;
y = sin(x);
fid = fopen('sinx.txt','w');
for i=1:11
fprintf(fid,'%5.3f %8.4f\n', x(i), y(i));
end
fclose(fid);
type sinx.txt
- 读写文件都是通过固定的I/O格式