Matlab笔记-第八章

语句

  • cell array元胞
cell(3,4) % cell的3行4列矩阵

cell1 = {23,'123','hello'} % {[23]} {['123']} {['hello']} 这就是cell的array
cellmat = {2,'a';3,'b'}; % cell矩阵

cell1(1) % {23}
cell1{1} % 23
cellmat{3}(1) % 'h'
cellmat{2,2} % 'b'
  • cell的删除
cell1 = {23,'123','hello'}
cell1(2) = []; % 把第二个格子删除了

cell1(2) = {'12'}; % {23,'12','hello'}把第二个柜子换了
  • cell的长度
cell1 = {'A','BB','CCC'};
length(cell1); % 3
strlength(cell1); % 1 2 3 

字符的捏合和拆分

  • strjoin和strsplit
name = {'123','456','789'};

name1 = strjoin(name,'-'); % 123-456-789
strsplit(name1,'-'); % 123 456 789

iscellstr(name); % 1

namechange = [name 123] % {'123'} {'456'} {'789'} {[123]}
  • 练习1-随机选取一个cell中的柜子
function Practice_8dot1(inputCell)

    TotalNumOfElement = numel(inputCell); % cell的总数
    randIndex = randi(TotalNumOfElement); % 随机cell的总数中的一个元素
    disp(inputCell{randIndex}); % 随机选取一个cell中的柜子

end

字典

  • struct字典
package = struct('item_no',123,'cost',19.99,'price',39.95,'code','g'); % field:字段 value:值

class(package) % 'struct'
package.item_no % 123 字典的访问
package.('item_no') % 123 字典的访问
  • struct字典的输入-字典中的field不允许以字母和特殊符号为开头
package.item = 123; % item:123
package.no = 5; % item:123 no:5
package.o = 'g'; % item:123 no:5 o:'g'

% 字典的修改
package.o = 'a'; % item:123 no:5 o:'a'

% 字典的删除
rmfield(package,'item'); % no:5 o:'a'

% 是否是字典
isstruct(package) % 1 是字典
isstruct({1 2 3}) % 0 不是字典

% 是否是字典的字段
isfield(package,'no') % 1 有存在字段为5

% 字典的所有字段
fieldnames(package) % {no} {o}
  • 练习1-查找字典中的字段
%% addressStruct(newstruct,'ab')
function addressStruct(struct,field)

    if isfield(struct,field)
        fprintf('is ''%s''',field);
        disp(struct.(field));
    else
        fprintf('erro');
    end
end
  • 练习2-字典多字段

在这里插入图片描述

packs(1) = struct('item',123,'cost',19.99,'price',39.99,'code','a');
packs(2) = struct('item',456,'cost',19.99,'price',39.99,'code','b');
packs(3) = struct('item',789,'cost',19.99,'price',39.99,'code','c');

%{
     item
     cost
    price
     code
}%
packs

%{
     item: 123
     cost: 19.9900
    price: 39.9900
     code: 'a'
}%
packs(1);
packs(1).name = struct1; % 给第一个字段新增一个struct1

%{
     item: 123
     cost: 19.9900
    price: 39.9900
    code: 'a'
   name: struct1
}%
packs(1);

%{
     item: 456
     cost: 19.9900
    price: 39.9900
    code: 'b'
   name: []
}%
packs(2); % 给第一个字段新增一个struct1;第二个也会出现一个新字段

%{
     item: 456
     cost: 19.9900
    price: 39.9900
   name: []
}%
refield(packs(1),'code'); % 就会删除 packs(1) packs(2) packs(3)的字段

packs.code; % 'a' 'b' 'c' % 逗号分隔符 写法等价packs(1).code,packs(2).code,packs(3).code
  • 逗号分隔列表Comma separated list
[1,2,3,4] % 1 2 3 4
1,2,3,4 % 1 2 3 4

% cell
cell = {12,'123','hello'};
cell{1:3}; % 12 '123' 'hello' 这就是逗号分隔符
cell{1},cell{2},cell{3}; % 12 '123' 'hello' 这就是逗号分隔符

[a,b,c] = cell{:}; % a=12 b='123' c='hello'  赋值[***] = ***的意思

% 所以上面👆的
packs.code; % 'a' 'b' 'c' % 逗号分隔符 写法等价packs(1).code,packs(2).code,packs(3).code
[packs.code]; % ['a' 'b' 'c'] 这是数组
  • 练习3-逗号分隔列表Comma separated list
a1 = 123;
a2 = '123';
a3 = 'hello';

% 用两步才可以构成Comma separated list
c = {a1,a2,a1}
[b1,b2,b3] = c{:};

% 用一步构成Comma separated list 
[b1,b2,b3] = deal(a1,a2,a3); % deal就是处理变成Comma separated list的;deal就是分割的意思
  • cell2mat
cell2mat({1,2,3}) % 1 2 3;cell变成矩阵;变成1行3列的矩阵
  • 练习4-画布中的Comma separated list 的使用
X =-pi:pi/10:pi;
Y1 = sin(X);
Y2 = cos(X);
Y3 = sinh(X);

%{
LineWidth 线宽
MarkerEdgeColor 点的颜色
MarkerFaceColor 点中间的颜色
MarkerSize 点的大小
%}

Dec = {'o-','LineWidth',3,'MarkerEdgeColor','k','MarkerFaceColor','y','MarkerSize',10};
figure(1);clf;hold on;

plot(X,Y1,Dec{:});
plot(X,Y2,Dec{:});
plot(X,Y3,Dec{:});
  • 数字会自动变成char
[65,'1']; % 'A1'
[65,"1"]; % "65","1"
  • cell的赋值
c = cell(1,2); % 新建一个1行2列的空cell
[c{:}] = size(rand(1,4)); % {[1]} {[4]}
[c{:}]; % 数组
c{:}; % 逗号分割

b = cell(1,4);
  • 练习5
packs(1) = struct('item',123,'cost',19.99,'price',39.99,'code','a');
packs(2) = struct('item',456,'cost',19.99,'price',39.99,'code','b');
packs(3) = struct('item',789,'cost',19.99,'price',39.99,'code','c');

save(packs_saved,packs) % 保存成packs_saved.mat的文件
load('packs_saved.mat') % 加载

function printpackages(packstruct)
    fprintf('\nItem # Cost Price Code \n\n');
    for i = 1:numel(packstruct)
        fprintf('6d %6.2f %7.2f %5c\n',...
        packstruct(i).item,...
        packstruct(i).cost,...
        packstruct(i).price,...
        packstruct(i).code);
    end
end
  • 练习6

在这里插入图片描述

最后的得到的
在这里插入图片描述

student(1) = struct('name','C,Joe','id_no',999,'quiz',[10.0,9.5,0.0,10.0]);
student(2) = struct('name','Hernandez,Pete','id_no',784,'quiz',[10.0,10.0,9.0,10.0]);
student(3) = struct('name','Brownnose,Violet','id_no',332,'quiz',[7.5,6.0,8.5,7.5]);

threeNote1(student);

function threeNote1(student)
    fprintf('Name         Average\n');
    for i = 1:numel(student)
        fprintf('%-20s %.1f\n',student(i).name,mean(student(i).quiz));
    end
end
  • 练习6-结构体嵌套结构体1

在这里插入图片描述

lineseg = struct('endpoint1',struct('x',2,'y',4),'endpoint2',struct('x',1,'y',6));
  • 练习7-结构体嵌套结构体2

在这里插入图片描述

cyls(3)=struct('code','c','dimensions',struct('rad',3,'height',6),'weight',9)
cyls(2)=struct('code','b','dimensions',struct('rad',4,'height',2),'weight',5)
cyls(1)=struct('code','a','dimensions',struct('rad',3,'height',6),'weight',7)

cyls(1).dimensions.rad; % 3

categorical类型

cell = {'ab','abc','abcde'};
mat = categorical(cell); % ab abc abcde将cell转化为categorical类型
  • 练习8-categorical的使用
A =[    ...
    3,2;...
    3,3;...
    3,2;...
    2,1;...
    3,2 ...
    ];
valueset = [1:3]; % 对应cell的index
catnames = {'child','adult','senior'}; % cell

% 'Ordinal',true开启排序 如可以使用 B(4,2) < B(1,1) 为 1;就是child < senior
B = categorical(A,valueset,catnames,'Ordinal',true);

table类型

  • 练习1-table类型创建身高体重
names = {'Harry','Sally','Jose'}; % 一般插入都用cell
weights = [185;133;210];
heights = [74;65.4;72.2];

patients = table(weights,heights,'RowNames',names); % 3行2列的table

% 其实还是对应 左行右列的原则
patients(1:2,1); % 1到2行,第1列的更小的table
patients('Harry',:); % Harry的这一行的所有信息
patients(:,'heights'); %  所有人的heights的信息
patients({'Harry','Sally'},:); % Harry和Sally的这一行的所有信息

summary(patients); % 查看一些信息

排序

  • sort
vec = [8 9 7 5 4 2];
sort(vec); % 也可以
sort(vec,'descend'); % 降序排序
sort(vec,'ascend'); % 升序排序

%% i_sorted返回排序前的index
vec1 = [7 5 9];
[w_sorted,i_sorted] = sort(vec1); % w_sorted 5 7 9;i_sorted 2 1 3
  • 练习2-struct按某个元素重新排序
cyls(3)=struct('code','c','dimensions',struct('rad',3,'height',6),'weight',9)
cyls(2)=struct('code','b','dimensions',struct('rad',4,'height',2),'weight',5)
cyls(1)=struct('code','a','dimensions',struct('rad',3,'height',6),'weight',7)

volume1 = [7 9 5];

for i = 1:numel(cyls)
    vol = volume1(i); % computeCylVol就是计算体积的自己写的
    cyls(i).volume = vol;
end

% ~忽略前值,取到升序排序后的值
[~ ,i_order] = sort([cyls.volume],'ascend');

% 赋值成升序排序后的值
cyls = cyls(i_order);
  • 练习3-table按某个元素重新排序
names = {'Harry','Sally','Jose'}; % 一般插入都用cell
weights = [185;133;210];
heights = [74;65.4;72.2];
patients = table(weights,heights,'RowNames',names); % 3行2列的table

[~ ,i_order] = sort(patients{:,'weights'}); % 将weights排序
patients(i_order,:); % 用i_order进行排序

%% 用行进行排序
sortrows(patients,'heights'); % 通过heights进行排序
issortedrows(patients,'heights'); % 判断是否已经排序
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值