目录
一、如何连续访问或者连续命名变量
a1=[1 2;3 4;5 6];
a2=[2 5;3 7;4 8];
a3=[9 5;8 4;7 3];
a4=[5 2;4 6;3 4];
a = cell(4,1);
for i = 1:4
a{i}=eval(strcat('a',num2str(i)))
end
二、如何画双y轴条形图且将数据显示

x={'中国','英国'};
xx = categorical(x); %定义分类数组
xx = reordercats(xx,x); %调用 reordercats 函数来指定条形的顺序
y = [1015.37 352.81; 5260 6943];
oo=[0,0]; %引入的零数组
yyaxis left %激活左侧
hold on
b1=bar(xx,[y(1,:);oo]); %引入零数组
ax = gca;
ax.YColor='black';
set(b1(1,1),'FaceColor','b');%选择1c(这个颜色
set(b1(1,2),'FaceColor','r');%选择1c(这个颜色
text(1-0.15,y(1,1),num2str(y(1,1)),'HorizontalAlignment','center','VerticalAlignment','bottom','FontSize',25,'FontName','Times New Roman');
text(1+0.15,y(1,2),num2str(y(1,2)),'HorizontalAlignment','center','VerticalAlignment','bottom','FontSize',25,'FontName','Times New Roman');
yyaxis right %激活右侧
hold on
b2=bar(xx,[oo;y(2,:)]); %引入零数组
set(b2(1,1),'FaceColor','b');%选择1c(这个颜色
set(b2(1,2),'FaceColor','r');%选择1c(这个颜色
ylim([1500 8000])
legend([b1(1,2) b2(1,1)],{'SiC相对于IGBT节省金额','HyS相对于IGBT节省金额'}) ; %只显示原始数据的图例
box on
ax = gca;
ax.YColor='black';
text(2-0.15,y(2,1),num2str(y(2,1)),'HorizontalAlignment','center','VerticalAlignment','bottom','FontSize',25,'FontName','Times New Roman');
text(2+0.15,y(2,2),num2str(y(2,2)),'HorizontalAlignment','center','VerticalAlignment','bottom','FontSize',25,'FontName','Times New Roman');
set(gca,'FontSize',25)
三、输出时间
datestr(now,‘yyyy-mm-dd HH:MM:SS’ )
四、同时给多个变量赋值
[x,y,z] = deal(0);
[a,b,c] = deal(1,2,3);
五、表格处理
5.1 表格读取
利用readtable进行表格读取,表格读取之后为table格式,将table转换成数组格式。
file.name = "result_13028.xlsx";
file.para = sheetnames(file.name);
data.raw = readtable(file.name,'Sheet',file.para(1));
data.n = table2array(data.raw(:,1));
data.n = data.n(~isnan(data.n));
5.2 表格保存
fullname = '666.xlsx';
a = table(table_500);
%str = [ "sdfdsf"];
%writematrix("str_you_type",fullname,'Sheet',"thermal",'Range',"A1");
%writematrix(str,fullname,'Sheet',"thermal",'Range',"A2");
writetable(a,fullname,'Sheet',"thermal",'Range',"A4",'WriteVariableNames',false);
%{
res = struct2cell(result)';
names = {'1','2','3','4','5','6','7','8','9','10','11','12'};
a = cell2table(res,"VariableNames",names );
fullname = '666.xlsx';
writetable(a,fullname,'Range',"A1",'WriteVariableNames',true);
%}
5.3 TSV数据提取
t = readtable("data.tsv", "FileType","text",'Delimiter', '\t');
5.4 批量处理表格
%% 读取名称
Path = 'C:\cxy\100_others\20250811-老化数据处理\20250811-老化数据处理\20250811-数据处理\第二批'; % 设置数据存放的文件夹路径
File = dir(fullfile(Path,'*.csv')); % 显示文件夹下所有符合后缀名为.xlsx文件的完整信息
FileNames = {File.name}'; % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
file.name = FileNames{2};
filename = [Path '\' file.name]; % 替换为实际文件名
% 读取数据
data.raw = readtable(filename);
5.5 复杂表格处理
既有字符串又有数字,表格空缺格式混乱。
clc
clear
%% 读取名称
Path = 'C:\s\sd'; % 设置数据存放的文件夹路径
File = dir(fullfile(Path,'*.csv')); % 显示文件夹下所有符合后缀名为.xlsx文件的完整信息
FileNames = {File.name}'; % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
file.name = FileNames{2};
filename = [Path '\' file.name]; % 替换为实际文件名
opts = detectImportOptions(filename);% 检测导入选项
opts.DataLines = [1 Inf]; % 读取所有行
opts.VariableNamesLine = 0; % 无标题行(第一行即数据)
opts.VariableTypes(:) = {'string'}; % 设为字符串
% 读取数据
data.raw = readtable(filename, opts);
data.n = table2array(data.raw(:,3));
data.n = str2double(data.n);
data.n = data.n(~isnan(data.n));
5.6 Excel自动调节表格宽度
fullname = '666.xlsx';
% 使用 ActiveX 自动调整 Excel 列宽
% 启动 Excel 应用程序
excel = actxserver('Excel.Application');
excel.Visible = false; % 后台运行
% 打开工作簿
workbook = excel.Workbooks.Open(fullfile(pwd, fullname));
% 获取第一个工作表
sheet = workbook.Sheets.Item(1);
% 获取所有使用的列
usedRange = sheet.UsedRange;
columns = usedRange.Columns;
% 自动调整列宽
columns.AutoFit;
% 保存并关闭
workbook.Save;
workbook.Close;
% 退出 Excel
excel.Quit;
% 删除 COM 对象
delete(excel);
disp('Excel 列宽已自动调整');
5.7 元胞保存表格
%{
result.name{i,1} = erase(file.name, '.csv');
result.v{i,1} = data.v(indx(finindx));
result.cur1{i,1} = data.CurU1(indx(finindx));
result.cur2{i,1} = data.CurU2(indx(finindx));
result.waterflow{i,1} = data.Waterflow(indx(finindx));
result.hwatertemp{i,1} = data.HWaterTemp(indx(finindx));
result.etemp{i,1} = data.ETemp(indx(finindx));
result.outwatertemp{i,1} = data.OutletWaterTemp(indx(finindx));
result.tempuinv1{i,1} = data.tempUInv1(indx(finindx));
result.tempvinv1{i,1} = data.tempWInv1(indx(finindx));
result.tempuinv2{i,1} = data.tempUInv2(indx(finindx));
result.tempvinv2{i,1} = data.tempWInv2(indx(finindx));
result.softwarever{i,1} = data.SoftwareVer{indx(finindx)};
%}
% 将结构体转换为表格
% 创建列名
names = {'名称','高压模块电压(V)','采集盒电流U1','采集盒电流U2','水流量(L/Min)',...
'回水温度(℃)','环境温度(℃)','出水温度(℃)','IGBT温度U逆变器1',...
'IGBT温度W逆变器1','IGBT温度U逆变器2','IGBT温度W逆变器2','集成软件版本'};
% 直接创建表格,避免中间转换
a = table(...
result.name, ...
result.v, ...
result.cur1, ...
result.cur2, ...
result.waterflow, ...
result.hwatertemp, ...
result.etemp, ...
result.outwatertemp, ...
result.tempuinv1, ...
result.tempvinv1, ...
result.tempuinv2, ...
result.tempvinv2, ...
result.softwarever, ...
'VariableNames', names);
六、数据处理
6.1 数据重新排列
利用reshape可以对数据进行重新排列。
a = [1 2 3 4];
b = [5;6;7;8];
c = reshape(a,4,1);
d = reshape(b,1,4);
%c =
% 1
% 2
% 3
% 4
%d = 5 6 7 8
6.2 数据整体重复
将数据重复组成一组有周期的数组。
a = [1 2 3];
b = repmat(a,3,1);%3行1列
% b=
% 1 2 3
% 1 2 3
% 1 2 3
6.3 数据单个元素重复
数据每个元素重复。
a = [0 1 2 3];
b = repelem(a,2);
% b = 0 0 1 1 2 2 3 3
6.4 两组数据对应寻找
在两个数组中找到相同的数据。
a = [6 0 1 2 3 4 5];
b= [5 4 3 2 1 0 6];
[c,a_indx,b_indx] = intersect(a,b,'rows');
%c/a_indx/b_indx = 空的 0×7 double矩阵
[d,a_indx,b_indx] = intersect(a,b);
% d = 0 1 2 3 4 5 6
% a_indx = 2 3 4 5 6 7 1
% b_indx = 6 5 4 3 2 1 7
6.5 重复数据删除并保留一个
一个数组中有多个重复数据,想要保留 一个周期的数据。
a = [1 2 3 4 5];
a = repelem(a,2)
b = unique(a);
%a =
% 1 1 2 2 3 3 4 4 5 5
%b =
% 1 2 3 4 5
6.6 数据排序
数据按照某一列排序。正数代表升序,复数代表降序。
a = [1 2 23 3 23 ;
2 4 54 45 23 ;]'
b = sortrows(a,1);
%b =
% 1 2
% 2 4
% 3 45
% 23 54
% 23 23
A = [2, 1];
sorted_A = sort(A); % 默认就是升序
% 结果:sorted_A = [1, 2]
A = [2, 1];
sorted_A = sort(A, 'descend');
% 结果:sorted_A = [2, 1]
6.7 NaN替换成0
将NaN替换为0,将0替换为NaN
x(find(isnan(x)==1)) = 0
6.8 数组限值
给一个数组限幅
x = [1 2 3 4];
x(x>2)=2;
6.9 元胞数据处理
6.9.1 删除空白值
删除元胞类型的空白值
myCell = myCell(~cellfun('isempty', myCell));
6.9.2 删除空白行
将元胞的空白行删除,选择1作为辅助数据。
a = cellfun(@isempty,TandD(:,2) );%挑选出第二列为空的数据
TandD (a)={'1'};%将数据填充为1
TandD(strcmp(TandD ,'1'),:)=[];删掉标记为1的行
6.9.3 提取元胞中的所有数据
将元胞进行组合,组合后提取所有数据
curve.Ic1{1} = 1:10;
curve.Ic1{2} = 2:10;
curve.Ic1{3} = 2:10;
curve.Ic1{4} = 2:10;
cell2mat(curve.Ic1(1,:));
6.9.4 删除元胞
将元胞删除
% 原始元胞数组
a = {'1', '2', '3'};
% 删除第二个元胞(索引为 2)
a(2) = []; % 注意:使用圆括号操作元胞结构,而非花括号
% 输出结果
disp('删除后的元胞数组:');
disp(a);
6.9.5 元胞匹配
find应用到元胞
% 原始元胞数组
a = {'100', '200'};
% 查找'200'的索引(关键:用strcmp比较元胞内容)
index = find(strcmp(a, '200')); % 返回 2
% 输出验证
disp(['"200" 的索引是:', num2str(index)]);
6.9.6 从元胞提取列向量首元素
在MATLAB中,如果您有一个元胞数组(cell array),其中包含3个元素,每个元素都是一个3×1的矩阵(即列向量),例如 C = {[1;2;3], [1;2;3], [1;2,3]}(注意:您写的{1,2,3}可能是个笔误,因为它表示包含三个标量的元胞,但根据描述,每个元素应是列向量,所以使用分号表示列向量如[1;2;3])。
您的目标是提取每个列向量的第一个元素,最终得到类似[1, 1, 1]的输出。
% 定义元胞数组(假设是1x3的元胞数组,每个元胞包含一个3x1列向量)
C = {[1;2;3], [1;2;3], [1;2;3]}; % 例如:您的例子
% 提取每个元胞中向量的第一个元素
first_elements = cellfun(@(x) x(1), C);
% 显示结果
disp(first_elements);
6.9.7 删除含有NaN的元胞
% 直接生成或从文件读取的元胞数据
your_cell = {180, NaN, NaN, NaN, NaN, NaN, NaN};
% 一步到位清理数据(保持为元胞数组)
cleaned_cell = your_cell(~cellfun(@isnan, your_cell));
disp(cleaned_cell); % 输出: {[180]}
6.10 填充空白值
将空白值填充为上一个数值,可以是元胞可以是矩阵。
TSRID = fillmissing(TSRID,'previous');
6.11 删除全行(列)
6.11.1 删除全零行
删除矩阵全零行或者列
data.I(all(data.I==0,2),:)=[] %删除全零行
data.I(:,all(data.I==0,1))=[] %删除全零列
6.11.2 删除NaN行
删除NaN行
%%% input
%%% a
%%% output
%%% b
a = [NaN;1;NaN;2];
b = a(all(~isnan(a),2),:); %删除含有NAN的行
%%% result
%%% b = [1;2];
%all函数:检测矩阵中是否全为非零元素,如果是,则返回1,否则,返回0。
%any函数:检测矩阵中是否有非零元素,如果有,则返回1,否则,返回0。
6.12 计算一行中非零元素个数
非零元素个数计算
sum(bst.output.Bst_I~=0,2)
6.13 序列生成
两种序列生成的等效
a=0;
b=10;
c=5;
x = linspace(a,b,c);
%等效于
x = a:c/(b-1):c
6.14 字符串
6.14.1 字符串比较
比较两字符串是否相同
s1 = 'abcv';
s2 = 'asd'
strcmp(s1, s2):用于比较字符串s1、s2是否相等,如果相等,返回结果1,否则返回0;
6.14.2 字符串拼接
字符拼接
strcat(a,b)%单纯字符串拼接
fullfile(a,b)%地址拼接
6.14.3 字符串拆分
将字符串进行拆分,分为数字、英文
% 定义一个示例字符串
str = '123abc.csv';
% 匹配数字部分
digits = regexp(str, '\d+', 'match', 'once');
% 匹配字母部分
letters = regexp(str, '[a-zA-Z]+', 'match', 'once');
% 匹配.csv部分
extension = regexp(str, '\.csv', 'match', 'once');
% 输出结果
disp(['数字部分: ', digits]);
disp(['字母部分: ', letters]);
disp(['扩展名部分: ', extension]);
or
myPath = "/Users/jdoe/My Documents/Examples"
myFolders = split(myPath,"/")
%{
myPath =
"/Users/jdoe/My Documents/Examples"
在 / 字符处拆分路径。split 将以 5×1 字符串数组的形式返回 myFolders。第一个字符串为 "",因为 myPath 以 / 字符开头。
%}
6.14.4 正则运算
取字符串的前几个数字eg.450VH,取450V 建议直接AI
6.14.5 字符串数组转数字
str2double()
6.14.6 判断字符串中是否包含另一字符串
str = "这是一个包含FG0001的字符串";
result = contains(str, "FG0001"); % 返回逻辑值 true/false
%注意是谁包含谁,第一个是大范围,第二个是小范围
6.15 随机数生成
随机数生成
unifrnd(a,b,[M,N,P,...])
unifrnd(1,10,5,1);%生成1-10 5个随机数
%生成的随机数区间在 (a,b) 内,排列成 M*N*P... 多维向量。如果只写 M,则生成 M*M 矩阵;如果参数为 %%%[M,N] 可以省略掉方括号。例如:
%原文链接https://blog.youkuaiyun.com/u014546828/article/details/122088172
6.16 矩阵插入
思路:以矩阵组合的形式进行插入,将矩阵分开,A(1,:) B A(2:end,:)
6.17 判断一个数是否为整数
判断
isinteger
6.18 寻找某一范围里的数值
% 函数:查找与220相差不超过5的元素并返回列索引
function HIndices = findNearColumns(matrix,targetValue,tolerance)
% 设置范围:215-225
% targetValue;
% tolerance;
lowerBound = targetValue - tolerance;
upperBound = targetValue + tolerance;
% 创建逻辑矩阵(满足条件的元素为 true)
conditionMatrix = (matrix >= lowerBound) & (matrix <= upperBound);
% 获取所有满足条件的元素列索引
[Indices,~] = find(conditionMatrix);
% 去重并排序
HIndices = unique(Indices);
end
6.19 结构体合并
function s = mergeStructs(s1, s2)
s = s1;
fields = fieldnames(s2);
for i = 1:length(fields)
field = fields{i};
if isstruct(s2.(field)) && isfield(s1, field) && isstruct(s1.(field))
s.(field) = mergeStructs(s1.(field), s2.(field)); % 递归合并
else
s.(field) = s2.(field); % 直接覆盖
end
end
end
% % 使用示例
% s_merged = mergeStructs(s1, s2);
6.20 判断是否包含数值并删除
在MATLAB中,要从数组 [1 2 3]中判断是否包含2,如果有则删除2
A = [1 2 3];
if any(A == 2)
A = A(A ~= 2); % 保留不等于2的元素
end
% 结果:A = [1 3]
七、在图中添加LaTex公式
% 标题中添加LaTeX格式公式
syms x
a = latex(sym(log(x.^2)./x));
x = 1:25;
plot(x, log(x.^2)./x);
title(['$' a '$'],'interpreter','latex', 'FontSize', 20);
set(gca,'FontSize',18);
结果如下:

八、设置
8.1 数据显示
在编辑模式下,鼠标悬停显示数据
预设项-编辑器/调试器-显示- 在编辑模式下启用数据显示。
九、文件处理
9.1 读取文件夹名称
读取文件夹名称
Path = 'C:\matlab\'; % 设置数据存放的文件夹路径
File = dir(fullfile(Path,'*.xlsx')); % 显示文件夹下所有符合后缀名为.xlsx文件的完整信息
FileNames = {File.name}'; % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
9.2 批量保存不同名称的文件
批量保存文件
for i = 1:6
xlswrite([num2str(i),'.xlsx'],i);
end
9.3 文件搜索功能
进行文件搜索
Path = 'C:\cxy\100_others\11_Scantool_search'; % 设置数据存放的文件夹路径
File = dir(fullfile(Path,'*.xlsx')); % 显示文件夹下所有符合后缀名为.xlsx文件的完整信息
FileNames = {File.name}'; % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
keyword = '2';
matchingFiles{1}='';
for i = 1:length(FileNames)
if contains(FileNames{i}, keyword, 'IgnoreCase', true)
matchingFiles{end+1} = FileNames{i};
end
end
matchingFiles = matchingFiles(~cellfun('isempty', matchingFiles));
9.4 地址拼接
path = fullfile('data','my','result') % path = 'data\my\result';
str = ['data','my','result']; % str = 'datamyresult'
9.5 提取名称创建文件夹
提取文件夹名称,如"115_PTCE-工况1-离合器-TM",按照工况建立文件夹。
Path = 'C:\';
File = dir(fullfile(Path,'*.csv')); % 显示文件夹下所有符合后缀名为.xlsx文件的完整信息
FileNames = {File.name}'; % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
% 提取最后一个下划线前的子字符串
tem = string(FileNames);
tem = regexp(tem, '^(.*)_[^_]*$', 'tokens', 'once');
cellArray = tem;
% 方法1:转换为字符串数组后提取唯一值
strArray = [cellArray{:}]; % 将元胞数组转换为字符串数组
[uniqueStr,uniqnum] = unique(strArray, 'stable'); % 提取唯一值(保持原顺序)
uniqueCell = num2cell(uniqueStr); % 转换回元胞数组格式
Fileidx = createSegmentedArray(1:length(FileNames), uniqnum') - 1;
for j = 1:length(uniqueCell)
mkdir('C:\cxy\100_others\20250812-泥城115数据处理\photo\', uniqueCell{j});
mkdir('C:\cxy\100_others\20250812-泥城115数据处理\table\', uniqueCell{j});
end
function result = createSegmentedArray(range, boundaries)
% CREATESEGMENTEDARRAY 创建分段值数组(自动生成分区值)
% 输入:
% range : 索引范围(如1:10)
% boundaries : 边界数组(如[1,7]),定义分区起点
% 输出:
% result : 自动从1开始增加的分区值数组
% 验证输入
validateattributes(range, {'numeric'}, {'vector', 'increasing', 'integer'});
validateattributes(boundaries, {'numeric'}, {'vector', 'increasing', 'integer'});
% 确保边界在索引范围内
boundaries = boundaries(boundaries >= min(range) & boundaries <= max(range));
nBoundaries = length(boundaries);
% 初始化结果数组(默认值0,表示未定义区域)
result = zeros(size(range));
% 添加虚拟边界以包含整个范围
extendedBoundaries = [min(range), boundaries, max(range)+1];
% 自动生成值数组(从1开始)
segValues = 1:length(extendedBoundaries)-1;
% 遍历所有分区
for iSeg = 1:length(segValues)
segStart = extendedBoundaries(iSeg);
segEnd = extendedBoundaries(iSeg+1) - 1;
% 找到在范围内的索引
segIndices = find(range >= segStart & range <= segEnd);
% 分配分区值
result(segIndices) = segValues(iSeg);
end
end
十、信号处理
10.1 求信号上下包络
用于求稳定值(1)d=diff(y);这步就是求信号序列的前一项后一项的差分,如果大于0就是升,小于0就是降,(2)如果d1.*d2<0说明就是极值点了,得到波峰波谷(3)波峰连线上包络线,反之下包络线。
function [y_down,y_up] = UpperAndLowerEnvelopes(y,t)
d=diff(y);%求差分
n=length(d);
d1=d(1:n-1);%差分序列1
d2=d(2:n);%差分序列2,与差分序列1差1个数
indmin = find(d1.*d2<0 & d1<0)+1;%求得谷值索引
indmax= find(d1.*d2<0 & d1>0)+1;%求得峰值索引
y_down = spline(t(indmin),y(indmin),t);%下包络
y_up = spline(t(indmax),y(indmax),t);%上包络
diff(y_up)
end
十一、符号处理
11.1 符号美化
用于符号美化,符号文字输出后美化直观。
function h=symdisp(s)
%//SYMDISP Display a symbolic expression in human readable form.
%// symdisplay(S) displays the symbolic expression S in a small figure window,
%// using standard mathematical notation.
%//
%// Examples:
%// syms x t positive
%// f=taylor(cos(x));
%// symdisp(f)
%// f=int(exp(-t)*t^(x-1),t,0,inf);
%// symdisp(f)
%//
%// Required toolbox: Symbolic Math
%//
%// See also SYMBOLIC PRETTY.
if ~isa(s,'sym')
s=sym(s);
%error('输入参数必须是sym类型,请使用 sym() 将你的结果转化为sym类型.')
end
S=['$',latex(s),'$'];
S=strrep(S,'&','& \quad');
S=strrep(S,'{\it','\mathrm{');
h=msgbox(S,'字符的数学展示形式');
h1=get(h,'children');
h2=h1(1);
h3=get(h2,'children');
if isempty(h3)
h2=h1(2); h3=get(h2,'children');
end
set(h3,'visible','off')
set(h3,'interpreter','latex')
set(h3,'string',S)
set(h3,'fontsize',20)
w=get(h3,'extent');
W=get(h,'position');
W(3)=max(w(3)+10,125);
W(4)=w(4)+40;
set(h,'position',W)
h4=h1(2);
if ~strcmp(get(h4,'tag'),'OKButton'), h4=h1(1); end
o=get(h4,'position');
o(1)=(W(3)-o(3))/2;
set(h4,'position',o)
set(h3,'visible','on')
set(h,'color','w');
十二、高级应用
12.1 类应用
在 MATLAB 中,类是一种面向对象编程(OOP)的结构,用于封装数据和方法。
% 类定义,类名与文件名相同,假设文件名为 MyClass.m
classdef MyClass
% 属性部分,用于存储对象的数据
properties
% 公共属性,可在类外部访问
PublicProperty
% 私有属性,只能在类内部访问
private
PrivateProperty
end
% 方法部分,用于定义类的行为
methods
% 构造函数,用于创建对象时初始化属性
function obj = MyClass(publicValue, privateValue)
obj.PublicProperty = publicValue;
obj.PrivateProperty = privateValue;
end
% 公共方法,可在类外部调用
function displayInfo(obj)
fprintf('Public Property: %s\n', obj.PublicProperty);
fprintf('Private Property: %s\n', obj.PrivateProperty);
end
end
end
classdef:用于定义类,类名必须与文件名相同。properties:用于定义类的属性,可以分为公共属性和私有属性。methods:用于定义类的方法,包括构造函数和普通方法。构造函数的名称必须与类名相同,用于创建对象时初始化属性
类应用案例:
% 创建 MyClass 对象
obj = MyClass('Hello', 'World');
% 调用对象的方法
obj.displayInfo();
在以下几种情况下,使用类会非常有用:
-
代码复用:当你需要多次使用相似的代码逻辑时,可以将其封装在类中,避免代码重复。例如,如果你需要处理多个不同的数据集,但处理步骤相似,你可以创建一个数据处理类,将处理步骤封装在类的方法中。
-
模块化设计:类可以将相关的数据和方法封装在一起,提高代码的可维护性和可读性。例如,在一个大型的项目中,你可以将不同的功能模块设计成不同的类,每个类负责一个特定的任务。
-
数据封装:类可以将数据封装在属性中,并通过方法来访问和修改这些数据,从而实现数据的隐藏和保护。例如,你可以将一些敏感数据定义为私有属性,只允许通过公共方法来访问和修改。
类的优势
-
封装性:类可以将数据和方法封装在一起,隐藏内部实现细节,只暴露必要的接口。这样可以提高代码的安全性和可维护性,减少外部代码对内部数据的直接访问和修改。
-
继承性:MATLAB 支持类的继承,允许你创建一个新的类,继承现有类的属性和方法,并可以在此基础上进行扩展和修改。这样可以提高代码的复用性和可扩展性。
% 定义一个子类,继承自 MyClass
classdef MySubClass < MyClass
methods
function newDisplayInfo(obj)
fprintf('This is a subclass.\n');
obj.displayInfo();
end
end
end
% 创建子类对象
subObj = MySubClass('Hello', 'World');
% 调用子类的方法
subObj.newDisplayInfo();
使用类来计算不同图形的面积:
1.定义基类
classdef Shape
% 抽象基类 Shape,用于表示几何图形
methods (Abstract)
% 抽象方法,用于计算图形的面积
area = calculateArea(obj)
end
end
classdef Shape:定义了一个名为Shape的类。methods (Abstract):表示下面定义的方法是抽象方法,抽象方法在基类中不实现具体代码,而是要求派生类必须实现这些方法。area = calculateArea(obj):这是一个抽象方法,用于计算图形的面积,派生类需要实现该方法。
2.定义派生类
classdef Rectangle < Shape
% 矩形类,继承自 Shape 类
properties
% 矩形的长度
length
% 矩形的宽度
width
end
methods
% 构造函数,用于初始化矩形的长度和宽度
function obj = Rectangle(length, width)
obj.length = length;
obj.width = width;
end
% 实现基类的抽象方法,计算矩形的面积
function area = calculateArea(obj)
area = obj.length * obj.width;
end
end
end
classdef Rectangle < Shape:定义了一个名为Rectangle的类,它继承自Shape类。properties:定义了矩形的两个属性,length(长度)和width(宽度)。methods:包含构造函数Rectangle和实现基类抽象方法的calculateArea方法。calculateArea方法根据矩形面积公式面积 = 长度 × 宽度计算矩形的面积。
classdef Circle < Shape
% 圆形类,继承自 Shape 类
properties
% 圆形的半径
radius
end
methods
% 构造函数,用于初始化圆形的半径
function obj = Circle(radius)
obj.radius = radius;
end
% 实现基类的抽象方法,计算圆形的面积
function area = calculateArea(obj)
area = pi * obj.radius^2;
end
end
end
classdef Circle < Shape:定义了一个名为Circle的类,它继承自Shape类。properties:定义了圆形的一个属性,radius(半径)。methods:包含构造函数Circle和实现基类抽象方法的calculateArea方法。calculateArea方法根据圆形面积公式面积 = π × 半径²计算圆形的面积。
3.调用
% 创建一个矩形对象,长度为 5,宽度为 3
rect = Rectangle(5, 3);
% 计算矩形的面积
rectArea = rect.calculateArea();
fprintf('矩形的面积是: %.2f\n', rectArea);
% 创建一个圆形对象,半径为 2
circ = Circle(2);
% 计算圆形的面积
circArea = circ.calculateArea();
fprintf('圆形的面积是: %.2f\n', circArea);
- 首先创建一个
Rectangle类的对象rect,并传入长度和宽度的值。 - 调用
rect对象的calculateArea方法计算矩形的面积,并将结果存储在rectArea中。 - 然后创建一个
Circle类的对象circ,并传入半径的值。 - 调用
circ对象的calculateArea方法计算圆形的面积,并将结果存储在circArea中。 - 最后使用
fprintf函数输出矩形和圆形的面积。
十三、时间序列处理
matlab读取的是datetime类型的时间,第一个是2025-08-12 14:43:43.391第二个是2025-08-12 14:45:43.391第三个是第二个是2025-08-12 14:50:43.391将第一个时间作为0s的开始,下面的时间根据时间差重新映射,要求画出图形,第一个时间对应的数据是1,第二个时间对应的数据是2,第三个时间对应的数据是3。
% 定义输入的datetime时间数据
times = [
datetime('2025-08-12 14:43:43.391', 'Format', 'yyyy-MM-dd HH:mm:ss.SSS')
datetime('2025-08-12 14:45:43.391', 'Format', 'yyyy-MM-dd HH:mm:ss.SSS')
datetime('2025-08-12 14:50:43.391', 'Format', 'yyyy-MM-dd HH:mm:ss.SSS')
];
% 对应的数据点
dataPoints = [1; 2; 3];
% 计算相对于第一个时间的时间差(秒)
timeZero = times(1); % 参考起始时间
elapsedSeconds = seconds(times - timeZero); % 转换为秒单位
% 绘制图形
figure;
plot(elapsedSeconds, dataPoints, '-o', 'LineWidth', 1.5, 'MarkerSize', 8);
% 添加图形标签和标题
xlabel('时间差 (秒)');
ylabel('数据值');
title('时间序列数据映射');
grid on;
% 标记数据点
text(elapsedSeconds, dataPoints, compose('数据点 %d', dataPoints), ...
'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'left');
% 设置横轴从0开始
xlim([0, max(elapsedSeconds) + 10]);
TO BE CONTINUE...
4万+

被折叠的 条评论
为什么被折叠?



