matlab【学习语法】函数定义、匿名函数调用

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);

好处如下:

  1. 封装和简化调用
    匿名函数可以用来封装对另一个函数的调用,特别是当你需要传递一些固定的参数时。这样可以使调用更简洁,并且可以减少重复代码。

示例:
假设你每次调用 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 参数。

  1. 闭包特性
    匿名函数可以捕获并保存定义它们的作用域中的变量(即闭包)。这意味着即使在匿名函数外部改变了这些变量,匿名函数仍然可以访问到最新的值。

示例:
假设你需要在一个循环中多次调用某个函数,并且每次调用时需要不同的参数值。

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值