目录
7.多维数组---Multidimensional Array
10.文件访问---save()、load()、xlsread()、xlswrite()
变量类型
1.char
示例:
>> s1 = 'h'; % 把h的ascii码显示出来 同理'H'也一样
whos;
uint16(s1)
Name Size Bytes Class Attributes
s1 1x1 2 char
ans =
uint16
104
2.string
示例:
>>s1 = 'Example';
>>s2 = 'String';% 声明两个字符串s1 s2
>> s3 = [s1 s2] % 合并成同一行
s3 =
'ExampleString'
>> s4 = [s1; s2] % 报错因为Example和String的长不一样,所以不能并列
错误使用 vertcat
要串联的数组的维度不一致。
>> s2 = 'Stringg' % 重新声明s2的字符长度和s1一样
>> s4 = [s1; s2] % 此时合并成列成功
s4 =
2×7 char 数组
'Example'
'Stringg'
3.逻辑运算和分配
示例:
>> str = 'aardvark';
>> 'a' == str % 将a与str中的字符一一匹配,相同的话返回1否则返回0
ans =
1×8 logical 数组
1 1 0 0 0 1 0 0
补充:
>> 'aardvark' == str % 如果被str一样的话会全部返回1
ans =
1×8 logical 数组
1 1 1 1 1 1 1 1
>> 'aardvar' == str % 要么是单个字符要么是和原来的字符串一样,其它情况都会报错
对于此运算,数组的大小不兼容。
相关文档
>> 'aardva' == str
对于此运算,数组的大小不兼容。
相关文档
>> 'aa' == str
对于此运算,数组的大小不兼容。
相关文档
如何让整个逻辑值返回1?
示例:
>> "aardvark" == str % 这里需要双引号
ans =
logical
1
如何计算str中某个字符的总个数?以a为例
示例:
>> str(str == 'a') % 这句话的意思会把str中的a全列出来
ans =
'aaa'
>> length(ans) % 求str中的某个字符的长度 或者length(str(str == 'a'))合并成一句
ans =
3
接下来怎么让str中的a全部更换成其它自己想要的字符?
示例:
>> str(str == 'a') = 'Z' % 将str中的a全部替换为Z
str =
'ZZrdvZrk'
练习:字符串逆置
示例:(仅供参考,每个人的写法不一样)
%字符串逆置 思路,从后到前索引
s1 = 'I like English';
k = 1;
for i = size(s1, 2) : -1 : 1 % s1是1×14的,size(s1, 2)就是第二个维度14 按-1递减
for j = size(s1, 1) : 1 % size(s1, 1)就是第1个维度1
s2(j, k) = s1(j, i); % 第一次就是s1(14, 1)最后一个字符h,以次类推,不断的存放在s2这个vector中
k = k+1;
end
end
disp(s2); % 把逆置的打印出来
结果:
>> demo_11
hsilgnE ekil I
4.结构体---structure
示例:
>>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];
结果:
>>student
student =
包含以下字段的 1×2 struct 数组:
name
id
number
grade
对student进行索引
示例:
>> student.name % 把所有name显示出来
ans =
'John Doe'
ans =
'Ann Lane'
>> student(1).name % 对第1个学生进行索引
ans =
'John Doe'
>> student(2).name % 对第2个学生进行索引
ans =
'Ann Lane'
>> student(1).grade % 显示第一个学生的成绩
ans =
100.0000 75.0000 73.0000
95.0000 91.0000 85.5000
100.0000 98.0000 72.0000
>> student(1).grade(1,3) % 具体到某一个科目的成绩
ans =
73
把student中的某一个字段值取掉?
示例:
>> fieldnames(student) % 返回student中的所有字段名称
ans =
4×1 cell 数组
{'name' }
{'id' }
{'number'}
{'grade' }
>> rmfield(student, 'id') % 将student中的id字段删除,你会发现此时是储存在ans中,所以student并没有删除
ans =
包含以下字段的 1×2 struct 数组:
name
number
grade
>>student = rmfield(student, 'id') % 这句话就会把student中的id字段彻底删除
student =
包含以下字段的 1×2 struct 数组:
name
number
grade
>> student.id % 再次查找报错
无法识别的字段名称 "id"。
一些结构体功能:
cell2struct | 将元胞数组转换为结构体数组 |
fieldnames | 结构体的字段名称 |
getfield | 结构体数组字段 |
isstruct | 确定输入是否为结构体数组 |
isfield | 确定输入是否为结构体数组字段 |
orderfields | 结构体数组的顺序字段 |
rmfield | 删除结构体中的字段 |
setfield | 为结构体数组字段赋值 |
sturuct | 结构体数组 |
struct2cell | 将结构体转换为元胞数组 |
structfun | 对标量结构体的每个字段应用函数 |
5.嵌套结构体---Nesting Structures
struct | s = struct(field,value) 创建具有指定字段和值的结构体数组。value 输入参数可以是任何数据类型 |
示例:
data是字段名,后面紧跟的是其对应的值,字段nest又是一个结构体
>> 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
A =
包含以下字段的 1×2 struct 数组:
data
nest
索引上述的A结构体:
>> A.data % 全部的data都会显示
ans =
3 4 7
8 0 1
ans =
9 3 2
7 6 5
>> A(1).data % 只索引第1个的data
ans =
3 4 7
8 0 1
>> 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(1).nest.testnum % 索引第一个nest的testnum用A(1) 第二个的话就是A(2)
ans =
'Test 1'
6.元胞数组---Cell Array
如何直接构造这么一个元胞数组?
方式一:
>> % 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]} {[-3.1416 0 3.1416]}
方式二:
>> % 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]} {[-3.1416 0 3.1416]}
练习(创建这么一个cell):
示例:
>> 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×2 cell 数组
{'this is the first cell'} {[5.0000 + 6.0000i 4.0000 + 5.0000i]}
{3×3 double } {["Tim" "Chris" ]}
对上述a进行索引(注意区分a()和a{}的区别):a()显示的是每一个cell,而a{}显示的是具体的cell的详细信息。示例:
>> a(1, 1) % 小括号
ans =
1×1 cell 数组
{'this is the first cell'}
>> a(2, 1)
ans =
1×1 cell 数组
{3×3 double}
>> a{1, 1} % 中括号
ans =
'this is the first cell'
>> a{2, 1}
ans =
1 2 3
4 5 6
7 8 9
>> a{2, 1}(3, 3) % 显示(2, 1)cell中的9
ans =
9
cell相关功能(可官网自行查找):
num2cell()和mat2cell()
num2cell() | 将数组转换为相同大小的元胞数组
|
mat2cell() | 将数组转换为在元胞中包含子数组的元胞数组 |
示例(可能解释的不是很清楚,可以按照下面的步骤敲一遍估计就有feel了):
>> a = magic(3)
a =
8 1 6
3 5 7
4 9 2
>> b = num2cell(a) % 将a中每一个位置上的元素都变成cell
b =
3×3 cell 数组
{[8]} {[1]} {[6]}
{[3]} {[5]} {[7]}
{[4]} {[9]} {[2]}
>> c = mat2cell(a, [1 1 1], 3) % [1 1 1]这里表示的是有3行, 3表示的是3列,这里的,每一行有3列,这一行的三个数会组成一个cell数组,可以看成{1×3} {1×3} {1×3}--->3×1的cell数组。
c =
3×1 cell 数组
{[8 1 6]}
{[3 5 7]}
{[4 9 2]}
>> d = mat2cell(a, [1 1 1], [1 1 1]) % {1×1}有9个
d =
3×3 cell 数组
{[8]} {[1]} {[6]}
{[3]} {[5]} {[7]}
{[4]} {[9]} {[2]}
>> e = mat2cell(a, 3, 3) % 直接变成了一个1×1的cell数组 可能将的不是很清楚,多试试应该有神会
e =
1×1 cell 数组
{3×3 double}
>> e{1}
ans =
8 1 6
3 5 7
4 9 2
>> e{1, 2} = 'i hate matlab!' % 可以往里面添加cell。
e =
1×2 cell 数组
{3×3 double} {'i hate matlab!'}
>> e{2,1} = 'fff' % 会变成一个2×2 cell 数组
e =
2×2 cell 数组
{3×3 double} {'i hate matlab!'}
{'fff' } {0×0 double }
>> celldisp(e) % 把每个cell数组disp出来
e{1,1} =
8 1 6
3 5 7
4 9 2
e{2,1} =
fff
e{1,2} =
i hate matlab!
e{2,2} =
[]
7.多维数组---Multidimensional Array
示例:
>> 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]';
结果:
>> A
2×2×2 cell 数组
A(:,:,1) =
{2×2 double} {'Name' }
{[ 7]} {0×0 double}
A(:,:,2) =
{'Name2' } {[ 3]}
{[0 1 2 3]} {2×1 double}
8.cat()串联数组
示例:
>> A=[1 2;3 4];
>> B=[5 6;7 8];
结果1:
>> C=cat(1,A,B)
C =
1 2
3 4
5 6
7 8
结果2:
>> C=cat(2,A,B)
C =
1 2 5 6
3 4 7 8
结果3:
>> C=cat(3,A,B)
C(:,:,1) =
1 2
3 4
C(:,:,2) =
5 6
7 8
三种结果的平面展示:
基于上述构造一个3位的数组:
示例:
>> 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]';
结果:
>> A
A =
2×2 cell 数组
{2×2 double } {'Name'}
{[2.0000 - 4.0000i]} {[ 7]}
>> C = cat(3, A, B)
2×2×2 cell 数组
C(:,:,1) =
{2×2 double } {'Name'}
{[2.0000 - 4.0000i]} {[ 7]}
C(:,:,2) =
{'Name2' } {[ 3]}
{[0 1 2 3]} {2×1 double}
三维展示:
9.reshape()---重构数组
示例:
>> A = {'James Bond', [1 2;3 4;5 6]; pi, magic(5)} % 2×2 cell 数组
A =
2×2 cell 数组
{'James Bond'} {3×2 double}
{[ 3.1416]} {5×5 double}
>> C = reshape(A,1,4) % 变成1×4 cell 数组 必须要是能变成的,
C =
1×4 cell 数组
{'James Bond'} {[3.1416]} {3×2 double} {5×5 double}
>> C = reshape(A,4,1) % 变成4×1 cell 数组
C =
4×1 cell 数组
{'James Bond'}
{[ 3.1416]}
{3×2 double }
{5×5 double }
练习:
示例:
>> A = [1:3; 4:6]; % 2×3
>> A
A =
1 2 3
4 5 6
>> B = reshape(A, 3, 2) % 3×2
B =
1 5
4 3
2 6
>> B = reshape(A, 1, 6) % 通过纯行或者列重构的话会发现是按照列优先
B =
1 4 2 5 3 6
>> B = reshape(A, 6, 1)
B =
1
4
2
5
3
6
变量检查相关函数:
10.文件访问---save()、load()、xlsread()、xlswrite()
10.1save()
>> clear; a = magic(4);
>> save mydata1.mat % 找到文件打开会发现乱码
>> save mydata2.mat -ascii % 以-ascii保存
>> type('mydata1.mat') % 或者直接在命令行中查看,不用找路径那里的文件
>> type('mydata2.mat') % 同理
在窗口中找到自己的文件储存位置
结果:
10.2load()
>> clear % 先把之前的进行清除 方便查看load()
>> load('mydata1.mat')
>> load('mydata2.mat', '-ascii')
结果:此时工作区会重新加载a和madata2
练习:怎么储存一个特定的变量?
示例:
>> p = rand(1,10);
>> q = ones(10);
>> save('pqfile.mat','p','q'); % 将特定的p、q储存
>> save('pqfile.txt','p','q','-ascii');
结果:
>> type('pqfile.txt')
8.1472369e-01 9.0579194e-01 1.2698682e-01 9.1337586e-01 6.3235925e-01 9.7540405e-02 2.7849822e-01 5.4688152e-01 9.5750684e-01 9.6488854e-01
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00
>> type('pqfile.mat')
MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Wed Nov 2 20:14:39 2022
10.3xlsread()
首先将信息填写完整存到当前目录下:
示例:
>> clear
>> score = xlsread('demo01.xlsx') % 不会显示名字和test的
score =
94 83 89
76 88 82
68 72 75
>> score = xlsread('demo01.xlsx', 'B2:D4') % B2:D4就是这三位学生的成绩,和上面显示的是一样
score =
94 83 89
76 88 82
68 72 75
10.4xlswrite()
如何求这三位学上的平均成绩?并把平均成绩写入demo.xlsx中?
示例:
>> mean(score) % mean是按照列进行计算的,而学生的成绩是一行,所以需要转置
ans =
79.3333 81.0000 82.0000
>> mean(score') % 对score进行转置之后就是每个学生的平均成绩注意这里是把平均成绩按行展示
ans =
88.6667 82.0000 71.6667
>> mean(score')' % 再接着对求出来的平均数进行转置变成列
ans =
88.6667
82.0000
71.6667
>> M = mean(score')' % 将平均成绩赋值给变量M
M =
88.6667
82.0000
71.6667
>> xlswrite('demo01.xlsx', M, 1, 'E2:E4') % 将mena写入对应位置,'demo01.xlsx':要储存的文件名字、M:要储存进demo.xlsx文件中的变量、1是excle中的sheet1,'E2:E4':对应的位置
结果:
接下来将mean放在这些数据的顶部E1
示例:
>> xlswrite('demo01.xlsx', {'mean'}, 1, 'E1') % 注意,执行的时候需要先把excle关掉否则报错
结果:
练习:算出标准差存放进demo01.xlsx中
示例:
>> S = std(score')' % 计算标准差 std:创建一个矩阵,并计算每一列的标准差。
S =
5.5076
6.0000
3.5119
>> xlswrite('demo01.xlsx', S, 1, 'F2:F4'); % 将标准差存进demo01.xlsx中
>> xlswrite('demo01.xlsx', {'std'}, 1, 'F1') % 将标准差名字std存进demo01.xlsx中
结果:
10.5同时读取文本和数字
示例:
>> xlswrite('demo02.xlsx', header, 1) % 先在工作空间新建demo02.xlsx文件,之后写入
结果:
示例:
>> xlswrite('demo02.xlsx', score, 1, 'B2:f4') % 将score写入相应的位置
结果:
11.I/O功能
11.1fprintf()写
示例:
x = 0:pi/10:pi;
y = sin(x);
fid = fopen('demo01.txt','w'); % 写权限
for i=1:11
fprintf(fid,'%5.3f %8.4f\n', x(i), y(i)); % 将x和y写进demo02.txt中, 5.3f表示的是整个字段是5位包括小数点后3位 8.4f同理
end
fclose(fid);
type('demo01,txt') % 打开txt文件
结果:
11.2fscanf()读
示例:
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);
结果:
>> type demo02.txt
John 1995 12 5 12.3 3.24
Tom 1995 12 7 2.3 2.0
Jean 1996 3 2 10.2 0
>> whos % 相应的变量会在工作区
Name Size Bytes Class Attributes
ans 1x1 8 double
fid 1x1 8 double
i 1x1 8 double
name 3x5 30 char
no1 1x3 24 double
no2 1x3 24 double
no3 1x3 24 double
no4 1x3 24 double
year 1x3 24 double
OVER