MATLAB笔记3:数据类型和文件读写
此篇笔记只记录较重要知识点,一些和其他编程语言相似不做记录
数据类型
- String连接
>> s1 = 'Example';
s2 = 'String';
>> s3 = [s1 s2]
s3 =
'ExampleString'
>> s4 = [s1;s2]
错误使用 vertcat
要串联的数组的维度不一致。
以上s4会出错,因为两个字符串要纵向连接需要维度相同,即字符个数相同
- String筛选
>> str = 'aardvark';
'a' == str
ans =
1×8 logical 数组
1 1 0 0 0 1 0 0
>> str(str=='a') = 'z'
str =
'zzrdvzrk'
- 结构体
>> 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(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];
获得Ann的grade的第三个数据
>> student(2).grade(3)
ans =
100
- 结构体 function
>> fieldnames(student)
ans =
4×1 cell 数组
{'name' }
{'id' }
{'number'}
{'grade' }
>> 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]
以上结构体A有两个域,data和nest,nest结构体又含有三个域
- Cell Array : cell数组
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
大括号"{}"索引和括号“()”索引的区别:
>> A
A =
2×2 cell 数组
{3×3 double } {'Anne Smith'}
{[3.0000 + 7.0000i]} {1×3 double }
>> A(1,1)
ans =
1×1 cell 数组
{3×3 double}
>> A{1,1}
ans =
1 4 3
0 5 8
7 2 9
可以看出大括号索引能获得具体数据信息
- 幻方矩阵
>> a = magic(3)
a =
8 1 6
3 5 7
4 9 2
>> sum(a)
ans =
15 15 15
>> sum(a,2)
ans =
15
15
15
每行总和等于每列总和
- 关于cell array 的 function
>> a
a =
8 1 6
3 5 7
4 9 2
>> b = num2cell(a)
b =
3×3 cell 数组
{[8]} {[1]} {[6]}
{[3]} {[5]} {[7]}
{[4]} {[9]} {[2]}
>> c = mat2cell(a, [1 1 1], 3)
c =
3×1 cell 数组
{1×3 double}
{1×3 double}
{1×3 double}
mat2cell()函数有两种划分方法:
C = mat2cell(A,dim1Dist,…,dimNDist)
C = mat2cell(A,rowDist)
第一种示例:
>> A = reshape(1:20,5,4)'
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
>> C = mat2cell(A,[1 3],[2 3])
C =
2×2 cell 数组
{1×2 double} {1×3 double}
{3×2 double} {3×3 double}
[1,3] 和 [2,3] 分别对应4X5的矩阵A
- 多维数组
% {}中第三个为第三维的索引
% -------第一层-------
A{1,1,1} = [1 2;4 5];
A{1,2,1} = 'Name';
A{2,1,1} = 2-4i;
A{2,1,1} = 7;
% -------第二层-------
A{1,1,2} = 'Name2';
A{1,2,2} = 3;
A{2,1,2} = 0:1:3;
A{2,2,2} = [4 5]';
- 数组连接(二维与三维):cat() 方法
A=[1 2;3 4];
B=[5 6;7 8];
C=cat(1,A,B); % 纵向连接
C=cat(2,A,B); % 横向连接
C=cat(3,A,B); % 三维连接
cell array 的三维连接
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)
File Access 文件存取
- 保存
clear;
a = magic(4);
save mydata1.mat
save mydata2.mat -ascii
- 读取
load('mydata1.mat')
load('mydata2.mat','-ascii')
- 加载excel文件
Score = xlsread('04Score.xlsx')
Score = xlsread('04Score.xlsx', 'B2:D4')
% B2:B4 指定行列数
- 写入excel文件
% 求出每个人的平均成绩写回 excel文件
M = mean(Score')';
xlswrite('04Score.xlsx', M, 1, 'E2:E4');
xlswrite('04Score.xlsx', {'Mean'}, 1, 'E1');
- 底层文件操作 fopen,fclose,fscanf,fprintf
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
type filename:显示文件内容
文件中内容如下:(列标题除外!)
x | y |
---|---|
0.000 | 0.0000 |
0.314 | 0.3090 |
0.628 | 0.5878 |
0.942 | 0.8090 |
1.257 | 0.9511 |
1.571 | 1.0000 |
1.885 | 0.9511 |
2.199 | 0.8090 |
2.513 | 0.5878 |
2.827 | 0.3090 |
3.142 | 0.0000 |
fid = fopen('04asciiData.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);
feof(fid)检测文件是否结束
- B站教程链接
台大郭彦甫matlab教程: 点击链接