变量与档案存取
参考课程:台大郭彦甫教授MATLAB课程
变量(进阶)
数据类型转换
Char
String
对string进行操作
如:
【例1】
【例2】
【注】如果想要比较整个字符串,可用strcmp()函数进行判断,两字符串相同返回1,不同则返回0
【练习1】
字符串反转1:采用for循环操作索引
s1 = 'I like the letter E';
s2 = [];
whos;
for i=1:size(s1,2)
s2(size(s1,2)-i+1) = s1(i);
end
disp(char(s2));
字符串反转2:直接采用reverse()方法
s1 = 'I like the letter E';
s2 = reverse(s1);
disp(s1);
disp(s2);
Structure(类似C语言的结构体)
student.name = 'Stefan';
student.id = 'jdfffooo.cc';
student.number = 3929844;
student.grade = [100,75,73;...
95,91,85.5;...
100,98,72];
student
可通过索引查找对应内容并且不断扩充结构体的内容,比如再添加第二个学生的信息:
【练习2】找到第二个学生的第三门成绩
结构体相关函数
函数名 | 说明 |
---|---|
cell2struct | 将元胞数组转换为结构体数组 |
fieldnames | 返回元胞数组中结构体数组的各个字段名称 |
getfield | 返回结构体中指定字段的值 |
isfield | 判断输入的字段是否是结构体里的 |
isstruct | 判断输入的是否是结构体 |
orderfields | 给指定结构体中的字段按名称(ASCII码)排序 |
rmfield | 删除结构体中指定的字段 |
struct | 创建结构体数组放到变量中 |
struct2cell | 将结构体数组转换为元胞数组 |
structfun | 对标量结构的每个域应用函数,返回任何数据类型的数组 |
嵌套结构
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
嵌套结构:
- structure A:
- string ‘data’
- matrix [3 4 7;8 0 1]
- string ‘nest’
- structure:
- string ‘testnum’
- string ‘Test 1’
- string ‘xdata’
- matrix [4 2 8]
- string ‘ydata’
- matrix [7 1 6]
Cell Array(元胞数组)
Cell Array,元胞数组,每个元胞都可以包含任意类型的数据,用 { } 进行声明。
两种声明方法:
- ( ) = { }:
A(1,1) = {[1 4 3;0 5 8;7 2 9]};
A(1,2) = {'Stefan'};
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} = 'Stefan';
A{2,1} = 3 + 7i;
A{2,2} = -pi:pi:pi;
A
【练习3】
A{1,1} = 'This is the first cell';
A{1,2} = [5+j*6 4+j*5];
A{2,1} = [1 2 3;4 5 6;7 8 9];
A{2,2} = ['Tim','Chris'];
A
区别 A(2,1) and A{2,1}:
如何取得某一元胞中的矩阵的某一个数?
如,
先花括号找到对应矩阵,再圆括号进行索引查找:
元胞数组相关函数
函数名 | 说明 |
---|---|
cell | 创建元胞数组,用 { } |
cell2mat | 将元胞数组转换为基础数据类型的普通数组 |
celldisp | 显示元胞数组内容 |
cellfun | 对元胞数组中每个元胞应用函数,各自返回对应函数的结果 |
cellplot | 以图形方式显示元胞数组的结构体 |
cellstr | 转换为字符向量元胞数组 |
iscell | 判断输入是否是元胞数组 |
mat2cell | 将数组转换为在元胞中包含子数组的元胞数组 |
num2cell | 将数组转换为相同大小的元胞数组 |
matrix --> cell
- num2cell():将数组转换为相同大小的元胞数组
【注】magic(n):生成一个n*n的幻方矩阵
- mat2cell():将数组转换为在元胞中包含子数组的元胞数组
- 参数1:原数组
- 参数2 / 3:指定如何划分数组的行 / 列
多维数组
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); % layer层拼接起来
reshape()函数:改变矩阵的维度
【练习4】
文件(File)的相关操作
- 读写Matlab文件
- 读写Excel表格
load() 和 save()
- save mydata1.mat:以二进制形式保存到文件
- save mydata2.mat -ascii:将数据以文本形式保存到文件
- load(‘mydata1.mat’)
- load(‘mydata2.mat’,’-ascii’)
加载文件到工作空间
【存储特定的变量到工作空间】
- save(filename,variables)
- save(filename,variables,’-ascii’)
Excel File Reading:xlsread()
如,读取一个Excel文件Score.xlsx:
- Scores = xlsread(‘Score.xlsx’):读取所有
- Scores = xlsread(‘Score.xlsx’,‘B2:D4’):读取Excel中特定范围内的数据
Excel File Writing:xlswrite()
- xlswrite(‘Score.xlsx’,M,1,‘E2:E4’);
- xlswrite(‘Score.xlsx’,{‘Mean’},1,‘E1’);
【练习5】计算平均值,算标准差,并写入到Score表格新的列中
M = mean(Scores')';
xlswrite('Score.xlsx',M,1,'E2:E4');
xlswrite('Score.xlsx',{'Mean'},1,'E1');
S = std(Scores')';
xlswrite('Score.xlsx',S,1,'F2:F4');
xlswrite('Score.xlsx',{'Std'},1,'F1');
通过Header提取数据的属性名(标题)的部分:
[Scores Header] = xlsread('Score.xlsx')
【练习6】将整个表格的所有数据都写入一个完整表格中,包括每一项数据的标题部分和数值部分
[Scores Header S] = xlsread('Score.xlsx');
xlswrite('test_Score.xlsx',S)
- Scores:只提取数值部分,头部标题为空
- Header:只提取头部标题,数值部分为空
- S:包含头部标题+数值部分
文件读写操作
写入操作
fid = fopen(’[filename]’,’[permission]’);(r、r+、w、w+、a、a+)
读取操作
fid = fopen('asciiData.txt','r');
i = 1;
while ~feof(fid)
name(i,:) = fscanf(fid,'%5c',1);
year(i) = fscanf(fid,'%d',1);
no1(i) = fscanf(fid,'%d',1);
no2(i) = fscanf(fid,'%d',1);
no3(i) = fscanf(fid,'%g',1);
no4(i) = fscanf(fid,'%g\n');
i = i + 1;
end
fclose(fid);