Skip to main content
 首页 » 编程设计

matlab中在MATLAB中,如何找到所有这些曲线下间隙最高点的坐标位置

2025年05月04日258bonelee

我有下图,其中绘制了 64 条单独的曲线。这些曲线需要超过一个垂直阈值。超过此阈值的空间宽度显示为 DoF,并由这两条垂直线定位,这两条垂直线可以位于曲线最中心部分与阈值相交的任何位置。

我的问题是如何确定垂直线之间且高于阈值但低于所有曲线的区域的最高点?这可能与交叉点不重合。

曲线没有相同的域(意味着它们的 X 值未对齐)。

我能想到的唯一方法(确实很笨拙)是从左到右循环 x 值,通过在该 x 值处插入一个点来询问每条曲线,获取所有这些值的最小值,然后移动到下一个x。这会构建一个最小值列表,然后我选择这些最小值中的最大值。

是否有更聪明的方法来做到这一点?我可以用绘制的数据来做到这一点吗?这几乎就像我想构建一个形状,然后找到该形状的最大 y 值。

Figure with 64 curves and spec. lines

请您参考如下方法:

我采用了数值方法,在同一域内并使用相同的增量重新创建各个曲线。这可以通过插值来完成,其中:

newCurve = interp1(origXvalues, origYvalues, newXvalues) 

但是我有我使用的曲线的多项式系数,所以我只是重新评估有界域上的多项式并使用了非常小的增量:

% X domain of interest 
minX; 
maxX; 
 
% Nx1 Cell array where rows are curve data (polynomial coefficients in this case) 
cellArray; 
 
% Pre-populate matrix where columns are curves 
matCurves = [];  
 
% Hi-res domain values 
newDomain = linspace(minX, maxX, 10000)';  
 
% Cycle through curve sets 
for jj = 1:size(cellArray, 1)  
    % Generate curve based on polynomials bounded within domain 
    matCurves(:, jj) = polyval(cellArray{jj}, newDomain);  
    % Or to use interpolation if cellArray had X and Y values as columns 
    % matCurves(:, jj) = interp1(cellArray{jj, 1}, cellArray{jj, 2}, newDomain); 
end 
 
% Find global max of the min of each domain increment 
[minValues, idx] = max(min(matCurves, [], 2));  
 
% Path that traces the lowest values within the domain 
minValues;  
 
% X value of maximum point below all curves within domain 
newDomain(idx);  

这对我来说非常有用,而且速度非常快。使用 polyvalinterp1 循环生成新曲线是我的 68 条曲线数据集花费最长但总共花费的时间,并生成具有 10000 个点的新曲线,从开始到结束在我的第七代酷睿 i7 笔记本电脑上只花了 0.06 秒。

更新:相关问题和解决方案,但不适合我。添加它是为了完整性以及其他通过这种方式的人。

关于Mathworks forum有人发布了这段代码来标记曲线上所有图的最大值的路径。要达到最小值,请将 max 更改为 min:

f=figure;hold on; 
plot(rand(10,3)) 
a=f.Children; 
L=a.Children; 
D={L.YData}; 
E=cell2mat(D'); 
plot(L(1).XData,max(E),'r') 

这非常聪明。看看它,它不太适合我的数据集,因为它要求曲线已经属于相同的 X 域,而我的不是。此外,我的曲线位于图形容器中的组中,因此与仅使用 2 个 Children 调用的答案相比,访问它们有点困难。对于不同的域,请注意这不会产生最小路径:

f=figure;hold on; 
plot(sort(rand(10,1)),rand(10,1),'b',sort(rand(10,1)),rand(10,1),'g',sort(rand(10,1)),rand(10,1),'k') 
a=f.Children; 
L=a.Children; 
D={L.YData}; 
E=cell2mat(D'); 
plot(L(1).XData,min(E),'r' 

无论如何,这都是为了完整性。