MATLAB中如何自动调整阈值提取三维数组各列最大突变点
MATLAB 实现每列仅保留1个最极端突变点的方法
原代码问题说明
你编写的代码仅对阈值做了单次增量判断:如果首次阈值得到的突变点数量大于1,仅会加一次步长重新计算,若加完之后突变点数量仍然大于1,不会继续升高阈值,因此无法实现目标。
实现方案
方案1:按需求循环升高阈值(符合你原本的逻辑)
把单次if判断替换为while循环,持续升高阈值直到对应列突变点数量≤1,同时增加边界判断避免阈值无限升高:
increment = 100; max_threshold = 1e6; % 设置阈值上限,避免极端情况死循环 TF = false(size(ydisplacements)); % 预先初始化TF数组,提升效率 for i = 1:size(ydisplacements,2) for j = 1:size(ydisplacements,3) threshold = 100; % 循环升高阈值,直到突变点数量≤1或者达到阈值上限 while true TF_col = ischange(ydisplacements(:,i,j),'Linear','Threshold',threshold); cnt = sum(TF_col); if cnt <= 1 || threshold >= max_threshold TF(:,i,j) = TF_col; break; end threshold = threshold + increment; end % 极端情况:阈值到上限后没有突变点,可按需补充逻辑选最大变化点,默认保留全0即可 end end
方案2:更高效的实现(无需循环调整阈值)
ischange支持输出第二个返回值,即每个点对应的突变偏差幅度,直接取幅度最大的点设为1即可,性能远高于循环调整阈值:
TF = false(size(ydisplacements)); for i = 1:size(ydisplacements,2) for j = 1:size(ydisplacements,3) [~, deviations] = ischange(ydisplacements(:,i,j),'Linear'); [~, max_idx] = max(deviations); % 取偏差最大的位置,就是最极端的突变点 TF(max_idx,i,j) = true; end end
内容的提问来源于stack exchange,提问作者Chiddy Brendan
相关产品推荐
相关产品推荐

