Matlab科研记录

目录

一、如何连续访问或者连续命名变量

二、如何画双y轴条形图且将数据显示

三、输出时间

四、同时给多个变量赋值

五、表格处理

5.1 表格读取

5.2 表格保存

5.3 TSV数据提取

5.4 批量处理表格

5.5 复杂表格处理

5.6 Excel自动调节表格宽度

5.7 元胞保存表格

六、数据处理

6.1 数据重新排列

6.2 数据整体重复

6.3 数据单个元素重复

6.4 两组数据对应寻找

6.5 重复数据删除并保留一个

6.6 数据排序

6.7 NaN替换成0

6.8 数组限值

6.9 元胞数据处理

6.9.1 删除空白值

6.9.2 删除空白行

6.9.3 提取元胞中的所有数据

6.9.4 删除元胞

6.9.5 元胞匹配

6.9.6 从元胞提取列向量首元素

6.9.7 删除含有NaN的元胞

6.10 填充空白值

6.11 删除全行(列) 

      6.11.1 删除全零行

      6.11.2 删除NaN行

6.12 计算一行中非零元素个数

6.13 序列生成

6.14 字符串

6.14.1 字符串比较

6.14.2 字符串拼接

6.14.3 字符串拆分

6.14.4 正则运算

6.14.5 字符串数组转数字

6.14.6 判断字符串中是否包含另一字符串

6.15 随机数生成

6.16 矩阵插入

6.17 判断一个数是否为整数

6.18 寻找某一范围里的数值

6.19 结构体合并

6.20 判断是否包含数值并删除

七、在图中添加LaTex公式

八、设置

8.1 数据显示

九、文件处理

9.1 读取文件夹名称

9.2 批量保存不同名称的文件

9.3 文件搜索功能

9.4 地址拼接

9.5 提取名称创建文件夹

十、信号处理

 10.1 求信号上下包络

十一、符号处理

11.1 符号美化

十二、高级应用

12.1 类应用

十三、时间序列处理


一、如何连续访问或者连续命名变量

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...

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The hopes of the whole village

看心情打赏咯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值