1.matlab函数创建
function 语法
function [y1,y2,…,yN] = myfun[x1,x2,…xM]
其中,[y1,y2,…yN]为输出量,myfun为函数名称,[x1,x2,…xM]为输入量
2.读写文件
1.使用fopen、fread函数:
% 文件路径
filename = 'D:\MATLAB\TACAN\gaussian_pulse.txt';
% 打开文件
fileID = fopen(filename, 'r');
if fileID == -1
error('无法打开文件: %s', filename);
end
% 读取文件中的所有数据
% 假设文件中每行有两个浮点数,用空格或逗号分隔
formatSpec = '%f %f'; % 如果是逗号分隔,请改为 '%f,%f'
dataArray = fscanf(fileID, formatSpec);
% 关闭文件
fclose(fileID);
% 将一维数组转换为二维数组
numDataPoints = length(dataArray) / 2;
dataMatrix = reshape(dataArray, [2, numDataPoints])';
% 分离时间轴和脉冲波形数据
t_axis = dataMatrix(:, 1); % 第一列是时间轴
pulse = dataMatrix(:, 2); % 第二列是脉冲波形
% 显示读取的数据
disp('时间轴:');
disp(t_axis);
disp('脉冲波形:');
disp(pulse);
解释
1.打开文件:使用 fopen 打开文件,并检查是否成功打开。
2.读取数据:使用 fscanf 按照指定的格式读取文件中的数据。这里假设文件中的每一行包含两个浮点数,用空格或逗号分隔。如果是逗号分隔,请将 formatSpec 改为 ‘%f,%f’。
3.关闭文件:使用 fclose 关闭文件以释放资源。
4.转换数据格式:fscanf 返回的是一个一维数组,需要使用 reshape 将其转换为二维数组。reshape(dataArray, [2, numDataPoints])'
将数据重新排列成两列,其中第一列是时间轴数据,第二列是脉冲波形数据。
5.分离数据:从二维数组中提取出时间轴和脉冲波形数据。
reshape(dataArray, [2, numDataPoints]):
- 详细说明
- reshape 函数用于改变数组的形状而不改变其内容。
- dataArray 是通过 fscanf 读取的一维数组,假设它包含了numDataPoints * 2 个元素(因为每行有两个数值:时间轴和脉冲波形)。
- [2, numDataPoints]指定了新的形状:2 行和 numDataPoints 列。这意味着我们希望将一维数组重新排列成一个有两行的二维数组。
- 转置操作 ': 在 MATLAB 中,单引号 ’ 表示对矩阵进行共轭转置(对于实数矩阵,就是普通的转置)。
- 转置操作将原来的 2 行numDataPoints 列的矩阵变成 numDataPoints 行 2 列的矩阵。 这样做的目的是为了让每一行表示一组时间轴和脉冲波形数据,即第一列是时间轴,第二列是脉冲波形。
具体例子:
假设你有一个文件 gaussian_pulse.txt,其中包含以下内容(每行两个浮点数,用空格分隔):
0.0 0.0
1.0 0.5
2.0 1.0
3.0 0.5
当你使用 fscanf 读取这个文件时,dataArray 将是一个包含 8 个元素的一维数组:
dataArray = [0.0, 0.0, 1.0, 0.5, 2.0, 1.0, 3.0, 0.5]
然后,使用 reshape(dataArray, [2, numDataPoints]) 会将其转换为一个 2 行 4 列的矩阵:
[
0.0, 1.0, 2.0, 3.0
0.0, 0.5, 1.0, 0.5
]
接着,对这个矩阵进行转置操作 ',得到:
[
0.0, 0.0
1.0, 0.5
2.0, 1.0
3.0, 0.5
]
注意事项
最终结果 dataMatrix 是一个 numDataPoints 行 2 列的矩阵,每一行分别对应时间轴和脉冲波形数据:
第一列 (t_axis):[0.0, 1.0, 2.0, 3.0]
第二列 (pulse):[0.0, 0.5, 1.0, 0.5]
总结
- reshape(dataArray, [2, numDataPoints]): 将一维数组 dataArray 重新排列成一个 2 行
numDataPoints 列的矩阵。 - ’ (转置操作): 将该矩阵转置,使其成为 numDataPoints 行 2列的矩阵,以便每一行包含一组时间轴和脉冲波形数据。
文件格式:确保文件格式与 formatSpec 中定义的格式匹配。如果文件中使用的分隔符不同,或者存在其他非数值数据(如注释),则需要调整 formatSpec 或者在读取前进行预处理。
错误处理:在实际应用中,建议添加更多的错误处理机制,例如检查文件是否存在、验证读取的数据是否符合预期等。
3.匿名函数调用:
这里是一个匿名函数调用的示例:
add_samples = @(new_samples, s, current_cycle, current_cycle_total, current_cycle_samples) ...
deal_with_samples(new_samples, s, samples_per_cycle, current_cycle, current_cycle_total, current_cycle_samples);
好处如下:
- 封装和简化调用
匿名函数可以用来封装对另一个函数的调用,特别是当你需要传递一些固定的参数时。这样可以使调用更简洁,并且可以减少重复代码。
示例:
假设你每次调用 deal_with_samples 时都需要传递相同的 samples_per_cycle 参数,你可以通过匿名函数来封装这个固定参数。
samples_per_cycle = 1024;
% 定义匿名函数,固定 samples_per_cycle 参数
add_samples = @(new_samples, s, current_cycle, current_cycle_total, current_cycle_samples) ...
deal_with_samples(new_samples, s, samples_per_cycle, current_cycle, current_cycle_total, current_cycle_samples);
% 使用匿名函数调用
[s, current_cycle_samples] = add_samples(new_samples, s, current_cycle, current_cycle_total, current_cycle_samples);
这种方式避免了每次调用 deal_with_samples 时都需要显式传递 samples_per_cycle 参数。
- 闭包特性
匿名函数可以捕获并保存定义它们的作用域中的变量(即闭包)。这意味着即使在匿名函数外部改变了这些变量,匿名函数仍然可以访问到最新的值。
示例:
假设你需要在一个循环中多次调用某个函数,并且每次调用时需要不同的参数值。
for i = 1:5
% 每次循环创建一个新的匿名函数,绑定当前的 i 值
add_samples = @(new_samples, s, current_cycle, current_cycle_total, current_cycle_samples) ...
deal_with_samples(new_samples, s, i * 1024, current_cycle, current_cycle_total, current_cycle_samples);
% 使用匿名函数调用
[s, current_cycle_samples] = add_samples(new_samples, s, current_cycle, current_cycle_total, current_cycle_samples);
end
在这个例子中,匿名函数捕获了当前循环迭代中的 i 值,并将其作为参数传递给 deal_with_samples。