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组H和J信号的关系', group));
plot(H, B_H);
title(sprintf('%d组CalibF H和J信号的关系', 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));
这一段 分类条件有问题,我分成两类一类是从右上角开始往左走,走到左下角的曲线,没有下面的曲线,你的这种逻辑是包含了下面的曲线,另外一类是从左下角开始往右走到右上脚,你的逻辑会使曲线少一截,同时,这两个过程并不是理想单调递增或递减,因为实际信号是有波动的