eval和sprintf函数循环

本文介绍了一种在MATLAB中使用循环结构批量定义多个符号变量的方法。通过简单的代码实现了从x1到x20共20个符号变量的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

%%%使用syms定义20个符号变量 x1,x2,…, x20.

for i=1:20

    eval(sprintf('syms x%d',i))
end
filePath = fullfile('C:\Users\Administrator\Desktop\校准坐标分析\2025_05_16_磁滞回线\0512磁滞回线测试'); % 设定GS间隔(用户自定义) H_JIANGE_GS = 10; % 每隔10 GS为一个区间 % 定义数据组数 num_datasets = 5; %% 循环处理每组数据 for group = 1:num_datasets % 动态获取CalibF1到CalibFX的数据 currentCalib = eval(['CZ', num2str(group)]); H = currentCalib{:, "VarName1"}; B_H = currentCalib{:, "VarName2"}; NUM = (1:height(currentCalib))'; J = B_H; B = B_H + H; % 保存每组处理后的变量,如H1, NUM1, average_H1, average_J1等 eval(['B', num2str(group), ' = B;']); eval(['H', num2str(group), ' = H;']); eval([' NUM', num2str(group), ' = NUM;']); % 找到H的最大值最小值索引 % 处理两部分 for part = 1:2 if part == 1 h_part = part1_H; j_part = part1_J; else h_part = part2_H; j_part = part2_J; end min_h = min(h_part); max_h = max(h_part); num_groups_part = ceil((max_h - min_h) / H_JIANGE_GS); average_h_part = zeros(num_groups_part, 1); average_j_part = zeros(num_groups_part, 1); for i = 1:num_groups_part lower = min_h + (i - 1) * H_JIANGE_GS; upper = lower + H_JIANGE_GS; idx = (h_part >= lower) & (h_part < upper); if any(idx) average_h_part(i) = mean(h_part(idx)); average_j_part(i) = mean(j_part(idx)); end end eval(sprintf('average_H_part%d_%d = average_h_part;', part, group)); eval(sprintf('average_J_part%d_%d = average_j_part;', part, group)); end %磁滞回线 退磁曲线专用 % 区间可视化 fig = figure('Position', [100 100 1000 800]); for part = 1:2 subplot(1, 2, part); h_avg = eval(sprintf('average_H_part%d_%d', part, group)); j_avg = eval(sprintf('average_J_part%d_%d', part, group)); % 修改绘图参数:只显示蓝色圆点,不连线 plot(h_avg, j_avg, '*r'); if part == 1 xlabel('H (GS) - 部分1'); ylabel('J - 部分1'); else xlabel('H (GS) - 部分2'); ylabel('J - 部分2'); end title(sprintf('%d组 部分%d 区间平均值连接', group, part)); grid on; end saveas(fig, fullfile(filePath, sprintf('%d组_两部分区间平均值连接.fig', group))); close(fig); % 1. NUM与H关系 fig = figure('Name', sprintf('%d组 NUM 与 H 的关系', group)); plot(NUM, -H); title(sprintf('%d组CalibF NUM 与 H 的关系', group)); saveas(fig, fullfile(filePath, sprintf('%d组CalibF H-NUM坐标图.fig', group))); close(fig); % 2. H间隔图 H_intervals = -diff(H); fig = figure('Name', sprintf('%d组H间隔图', group)); plot(2:length(H), H_intervals); title(sprintf('%d组CalibF负向磁场 H 每点间隔', group)); saveas(fig, fullfile(filePath, sprintf('%d组CalibF H间隔图.fig', group))); close(fig); % 3. B间隔图 B_intervals = diff(B); fig = figure('Name', sprintf('%d组B间隔图', group)); plot(2:length(B), -B_intervals); title(sprintf('%d组CalibF B 每点间隔', group)); saveas(fig, fullfile(filePath, sprintf('%d组CalibF B间隔图.fig', group))); close(fig); % 4. H与J关系 fig = figure('Name', sprintf('%d组HJ信号的关系', group)); plot(H, B_H); title(sprintf('%d组CalibF HJ信号的关系', group)); saveas(fig, fullfile(filePath, sprintf('%d组CalibF H-J坐标图.fig', group))); close(fig); % 5. NUM与B关系 fig = figure('Name', sprintf('%d组 NUM 与 B 的关系', group)); plot(NUM, -B); title(sprintf('%d组CalibF NUM 与 B 的关系', group)); saveas(fig, fullfile(filePath, sprintf('%d组CalibF B-NUM坐标图.fig', group))); close(fig); %% 生成每两组之间的差值图 for b = group + 1:num_datasets fig = figure('Position', [100 100 1000 800]); for part = 1:2 subplot(1, 2, part); if part == 1 h_avg_a = eval(sprintf('average_H_part%d_%d', part, a)); h_avg_b = eval(sprintf('average_H_part%d_%d', part, b)); plot(h_avg_a - h_avg_b, 'LineWidth', 1.2); ylabel('H差值 (GS) - 部分1'); else j_avg_a = eval(sprintf('average_J_part%d_%d', part, a)); j_avg_b = eval(sprintf('average_J_part%d_%d', part, b)); plot(j_avg_a - j_avg_b, 'LineWidth', 1.2); ylabel('J差值 - 部分2'); end title(sprintf('%d组与%d组 部分%d 差值', a, b, part)); grid on; end saveas(fig, fullfile(filePath, sprintf('%d组与%d组_两部分差值.fig', a, b))); close(fig); end end% 处理两部分 for part = 1:2 if part == 1 h_part = part1_H; j_part = part1_J; else h_part = part2_H; j_part = part2_J; end min_h = min(h_part); max_h = max(h_part); num_groups_part = ceil((max_h - min_h) / H_JIANGE_GS); average_h_part = zeros(num_groups_part, 1); average_j_part = zeros(num_groups_part, 1); for i = 1:num_groups_part lower = min_h + (i - 1) * H_JIANGE_GS; upper = lower + H_JIANGE_GS; idx = (h_part >= lower) & (h_part < upper); if any(idx) average_h_part(i) = mean(h_part(idx)); average_j_part(i) = mean(j_part(idx)); end end eval(sprintf('average_H_part%d_%d = average_h_part;', part, group)); eval(sprintf('average_J_part%d_%d = average_j_part;', part, group)); 这一段 分类条件有问题,我分成两类一类是从右上角开始往左走,走到左下角的曲线,没有下面的曲线,你的这种逻辑是包含了下面的曲线,另外一类是从左下角开始往右走到右上脚,你的逻辑会使曲线少一截,同时,这两个过程并不是理想单调递增或递减,因为实际信号是有波动的
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值