study = sprintf('Hs%d_Tp%d_D%d/',Hs,Tp,D);
study = sprintf('Hs%d_Tp%d_D%d/', Hs, Tp, D);
这行代码是根据当前参数值(Hs、Tp、D)自动拼接出一个文件夹名字符串,方便用于读取或保存对应的实验数据。
sprintf(...)
作用:(1)MATLAB 中的字符串格式化函数,类似于 C 语言里的 printf,但它不会输出到屏幕,而是返回一个字符串结果。
(2)这句代码用 sprintf 按指定格式拼接变量值,生成有序、可控的文件名,是批处理文件保存时的标准写法。
语法:
-
sprintf(模板字符串, 参数1, 参数2, ...)
'Hs%d_Tp%d_D%d/'
字符串模板(模板字符串),可以包含以下格式占位符(这里只包含了格式占位符的一种%d),用来告诉 MATLAB:Hs[数字]_Tp[数字]_D[数字]。

例1:已经在代码开头设置了
Tp = 12;
Hs = 67;
D = 10;
结果:study = 'Hs67_Tp12_D10/'
这就是一个路径字符串(用于后续读取或保存文件夹)!
加 / 是为了明确告诉你这是一条目录路径;
例2:
% Convert from txt to mat
for i=1:length(txtfiles)
newfilename = sprintf('Eta_Hs%d_Tp%d_D%d_S%02i.mat',Hs,Tp,D,i);
'Eta_Hs%d_Tp%d_D%d_S%02i.mat'
这是模板字符串,包含以下格式占位符:

路径字符串
路径字符串:
字符串【用’ ‘引号引起来的text】;因为它就是普通的文本(text),但内容是路径:
str = 'C:\Users\You\Desktop\data.csv'; % 字符串形式的路径
表示路径:用文字表示的文件或文件夹的位置,它告诉 MATLAB 去哪里找数据,或者把结果保存到哪里。
在matlab中的用法:

生成路径字符串的三种方式:
方法1:拼接
folder = 'C:\Users\Alice\Documents\MATLAB\Project1\';
file = 'data.txt';
filepath = [folder, file]; % 拼接字符串
方法2:fullfill()
folder = fullfile('C:\Users\Alice\Documents', 'MATLAB', 'Project1');
filepath = fullfile(folder, 'data.txt');
自动处理斜杠 / 和 \,跨平台更安全!
方法3:sprintf()
用 sprintf() 拼接格式化路径(灵活,有时更方便)
适合路径中包含变量、参数名、数字编号等情况。
fullfill()函数
作用:
fullfile 是 MATLAB 用来自动拼接路径字符串的函数,自动在路径部分之间添加合适的文件分隔符(/ 或 \)。
优点:
(相对于手动拼接)手动拼接路径虽然可以用 filepath = [folder, file],但在不同操作系统下容易出错,而 fullfile 会根据系统自动选择正确的分隔符(/ 或 \,取决于操作系统)。

基本语法格式
filepath = fullfile(part1, part2, part3, ...)
- 每个
partX都是路径的一部分(可以是文件夹名、文件名等) -
返回值是一个完整的路径字符串【函数关注:返回值】
举例
folder = 'C:\Users\Alice\Documents\MATLAB';
subfolder = 'Project1';
filename = 'data.txt';
% 拼接出完整路径
filepath = fullfile(folder, subfolder, filename);
% 输出:'C:\Users\Alice\Documents\MATLAB\Project1\data.txt' (在 Windows 上)
outputfolder = fullfile('../Output/',study);
作用:
【遇见fullfill()函数,则作用一定是:构造 路径字符串】构造路径字符串,不是创建文件夹。
mkdir(outputfolder);
% 如果文件夹不存在就创建它
mkdir() 是 MATLAB 内置函数,不是 C 语言,用于创建文件夹
mkdir 是 C 语言的吗?

使用matlab内置函数mkdir()常见搭配if
if ~exist(folderPath, 'dir')
mkdir(folderPath); % 如果文件夹不存在就创建
end
MATLAB 中自动创建文件夹的标准做法
第一句 if ~exit(folderpath,'dir')
exist(folderPath, 'dir')
作用:
exist 是 MATLAB 的内置函数,用于判断某个变量、函数、文件或文件夹是否存在。
语法,参数:
result = exist(name, type)
name:要判断的对象名,可以是变量名或路径名(路径字符串)
type:字符串,指定检查的对象类型,如 'var'、'file'、'dir'
返回值:
exist(...) 会返回一个 数字,用来表示“存在的类型”或“不存在”。
【💎函数(内置函数)----立即关注:返回值】

~exist(folderpath,'dir')
~exist(...)
➜ ~ 表示 “非/不是”,即不存在时为真
mkfol 函数function
function foldername = mkfol(foldername,parentfolder)
% This functions checks if the folder name exists and creates it if not.
% Additional parent folder argument will ammend the foldername on the
% parent path
% Returns the folder name if it has been changed
% YK 16
if nargin>1
foldername = fullfile(parentfolder,foldername);
end
if ~exist(foldername,'dir')
mkdir(foldername);
end
if ~strcmp(foldername(end),'/')
foldername(end+1) = '/';
end
第一段
function foldername = mkfol(foldername, parentfolder)
参数:虽然函数声明了两个参数,但通过 nargin 控制逻辑,你可以只传一个参数。这是 MATLAB 常见的灵活写法。
第二段
if nargin>1
foldername = fullfile(parentfolder,foldername);
end
nargin:
nargin 是 MATLAB 的一个特殊变量,表示:
调用函数时实际传入的参数个数
作用:通过nargin逻辑控制,可以在调用函数时只输入一个变量

第四段 :
if ~strcmp(foldername(end),'/')
foldername(end+1) = '/';
end
函数 mkfol 中的一个细节处理逻辑
foldername(end)
取的是字符串 foldername 的最后一个字符
比如:如果 foldername = '../Output/Run1'
那么:foldername(end) 就是 '1'
strcmp(foldername(end), '/')
strcmp定义
定义:是 MATLAB 的内置函数,全称是:**str**ing **cmp**are(字符串比较)
功能:
判断两个字符串是否完全相同
返回值:(返回值是逻辑值)
-
true(或1)→ 表示两个字符串完全一样 -
false(或0)→ 表示不同
语法格式
tf = strcmp(str1, str2)
foldername(end+1) = '/'
作用:
在字符串 foldername 的末尾,加上一个 / 字符
foldername(end + 1):
表示 "在最后一个字符的后面添加新字符"【MATLAB 支持对字符串直接扩展】
第四段improve:
if ~strcmp(foldername(end), filesep)
foldername(end+1) = filesep;
end
filesep
filesep 是系统专用路径分隔符:

mkfor改进
overall代码
function foldername = mkfol(foldername, parentfolder)
if nargin == 1
parentfolder = '';
end
if ~isempty(parentfolder)
foldername = fullfile(parentfolder, foldername);
end
if ~exist(foldername, 'dir')
mkdir(foldername);
end
if ~strcmp(foldername(end), filesep)
foldername(end+1) = filesep;
end
解析:
if ~isempty(parentfolder)
foldername = fullfile(parentfolder, foldername);
end
isempty(parentfolder) 是在判断:
parentfolder 是不是空的?
~isempty(...) 就是取反,表示:
如果 parentfold标题一er 不为空
也就是说:只有当你确实传了一个非空的父文件夹路径时,才会执行下面的拼接操作。
list textfiles
txtfiles = dir(fullfile(outputfolder,'*_S*.txt')); 【查找是dir??】
文件批处理语句:(1)在指定的文件夹folder中【outputfolder】,查找命名符合要求【*_S*.txt】的文件file(2)返回这些文件的信息结构体数组【是文件内部的信息吗】(3)保存到 txtfiles 中
*_S*.txt:通配符表达式,含义是:

*_S.txt 和 *_S*.txt 和 _S*.txt区别:
*的数量限制了 _S 在文件名中的位置:【可以把*看作 任意字符串(数量不限,可以为0)】
*_S.txt----_S只能在文件名末尾,且S为最后一个字符串,S后不能再有其他字符串
*_S*.txt----_S可以在文件名中任何位置
_S*.txt----_S只能在文件名中的开头位置

dir(...)
dir 是 MATLAB 的文件查询函数,返回值是一个结构体数组
timevector
time = (1/Fs : 1/Fs : t_target)';
(1/Fs : 1/Fs : t_target) 是一个向量构造表达式:
语法:start : step : end
(1/Fs : 1/Fs : t_target) ’
‘作用:行向量转置为列向量
目的:因为时间序列通常写成列向量形式,和其他列式信号(如位移、波高等)方便对齐。
作用:这行代码的作用是生成一个采样时间序列,表示从第一个采样点开始,到目标时间结束,每个采样点对应的时间值,间隔为 1/Fs。
采样点个数:Fs * t_target
向量构造表达式
向量:行向量或列向量【一组数值(必有一个维度大小是1)】
行向量构造表达式
语法:(1)start : step : end (2)start:end(默认step=1)
例1:v = 1:1:10 从1到10,每次加1
结果:v = [1 2 3 4 5 6 7 8 9 10]
- 第二个参数step:可正可负;如果向量生成表达式由标准的三个参数只剩下两个参数,则省略了step(默认step为1)
列向量构造表达式
方法:先构造行向量;再对行向量转置(转置符号 ’)
例2:
v = (1:5)'
结果
应用:timevector生成时间向量
% Time vector
Fs = 128; %采样频率
t_target = 1; %采样1秒
time_1 = (1/Fs:1/Fs:t_target)'; %从第一个采样的时间点(1/Fs)开始,每隔1/Fs秒取一个点(共128个点)
time_2 = (0:1/Fs:t_target)';%从0秒开始,每隔1/Fs秒取一个点(共129个点)
Convert from txt to mat
for i = 1:length(txtfiles)
for i = 1:length(txtfiles)
1:length(txtfiles)
本质(作用):创建一个向量,如果 length(txtfiles) =5
[1, 2, 3, ..., N]
MATLAB 是 1 基索引(1-based indexing) 的语言,所以循环索引 i 从1开始而不是从0开始。
newfilename = sprintf('Eta_Hs%d_Tp%d_D%d_S%02i.mat',Hs,Tp,D,i);
newfilename = sprintf('Eta_Hs%d_Tp%d_D%d_S%02i.mat',Hs,Tp,D,i);
fprintf('Reading Hs%d_Tp%d_D%d Seed %d \n',Hs,Tp,D,i)
fprintf('Reading Hs%d_Tp%d_D%d Seed %d \n',Hs,Tp,D,i)
fprintf(...)
-
是 格式化打印函数
-
和
sprintf类似,但它是直接打印到命令窗口(而不是返回字符串)
作用:fprintf 是 MATLAB 中格式化输出的标准方法,适合在循环中动态显示变量、处理进度、调试信息等,是写工程脚本必备技能。
'Reading Hs%d_Tp%d_D%d Seed %d \n'
格式字符串模板,里面包含变量占位符:

% read data in
[t,eta_full,zero_level] = fReadEta_Zero(fullfile(outputfolder,txtfiles(i).name),ngauge);
当前 txt 文件中的时间和波高数据提取出来,为后续处理和保存做准备,是批处理核心步骤
作用:
调用自定义函数 fReadEta_Zero,读取指定的 .txt 文件,返回:
-
t:时间向量 -
eta_full:所有测点的波高序列 -
zero_level:零基准面(基线)
txtfiles(i).name 这是当前循环中的第 i 个 .txt 文件的文件名
fullfile(outputfolder, txtfiles(i).name)
把文件名拼接成完整路径,用于读取文件。
好处:跨平台兼容(不管是 Windows 还是 macOS)
fReadEta_Zero(...) 自定义函数,用于读取 .txt 中的波浪数据
[t, eta_full, zero_level] = ...
这是函数的多输出解包形式:
-
t:时间向量(通常是一列,单位:秒) -
eta_full:波高数据矩阵,每列对应一个测点 -
zero_level:数据归零的参考高度(基准)
if t<t_target
warning(['Data is not of expected length. Expected time',num2str(t_target),', actual time=',num2str(t(end))])
end
num2str(t_target) 和 num2str(t(end))
作用:num2str 把数字转成字符串,才能和文字拼接
ind = (t(end)-t_target+1/Fs)*Fs;
数据截取
【还是不太懂 这里+1/Fs的含义】
eta = eta_full(ind:end,:);
1.运行.mlx实时脚本中的某一段代码:

第二段 绘图代码
% Figure 1
h_fig = figure;
plot(time,eta(:,gauge_1),'color','b')
hold on
plot(time,eta(:,gauge_2),'color','r')
title('Time-series')
legend('Gauge 22', 'Gauge 23')
xlabel('Time [s]')
ylabel('$\eta$ [m]')
h_fig = figure;
创建一个新的图窗口(Figure)【图窗口:用于绘图的窗口】;并把它的“身份编号”赋值给变量 h_fig
h_fig 是图的句柄,方便你后续设置图属性或保存
多图绘制时建议给每个图一个变量名
在 MATLAB 中,句柄(handle)就是对图形对象的“引用”,让你可以通过变量名操作图,而不是重新查找或创建它。
hold on
在 一张图内绘制多条曲线时,绘制完一条后,加上“hold on”,作用:(1)表示“在同一个图上继续画下一条线”(2)避免下一条线覆盖刚刚绘制好的线。
hold on机制:默认情况下,每次 plot(...),MATLAB 会清空之前的图;加了 hold on,就告诉 MATLAB:别清空,继续往上画。
比如三条线:
figure;
plot(x, y1, 'r'); % 第一条红线
hold on; % 保持图不清空,接着画
plot(x, y2, 'g'); % 第二条绿线
plot(x, y3, 'b'); % 第三条蓝线
legend('线1', '线2', '线3'); % 添加图例
xlabel('时间');
ylabel('值');
title('三条线图示');
hold on 只需写一次,就可以让你连续画出三条、四条、更多的线,直到你主动调用 hold off 为止。
710

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



