在MATLAB中,如何找到所有这些曲线下间隙中最高点的坐标位置?
我在下图中绘制了64条单独的曲线。这些曲线需要超过一个垂直阈值。此阈值上的空间宽度显示为DoF,并由这两条垂直线定位,这两条垂直线可以位于曲线最中心部分与阈值相交的任何位置 我的问题是如何确定垂直线之间以及阈值上方但所有曲线下方区域的最高点?这可能与交叉点不一致 曲线不具有相同的域(意味着其X值未对齐) 我能想到的唯一方法是,从左到右循环x值,通过在该x值处插值一个点来检查每条曲线,得到所有这些值的最小值,然后移动到下一个x。这建立了一个最小值列表,然后我选择这些最小值的最大值 有没有更聪明的方法?我可以用绘制的数据进行此操作吗?这几乎就像我想建立一个形状,然后找到该形状的最大y值在MATLAB中,如何找到所有这些曲线下间隙中最高点的坐标位置?,matlab,loops,max,shapes,curve,Matlab,Loops,Max,Shapes,Curve,我在下图中绘制了64条单独的曲线。这些曲线需要超过一个垂直阈值。此阈值上的空间宽度显示为DoF,并由这两条垂直线定位,这两条垂直线可以位于曲线最中心部分与阈值相交的任何位置 我的问题是如何确定垂直线之间以及阈值上方但所有曲线下方区域的最高点?这可能与交叉点不一致 曲线不具有相同的域(意味着其X值未对齐) 我能想到的唯一方法是,从左到右循环x值,通过在该x值处插值一个点来检查每条曲线,得到所有这些值的最小值,然后移动到下一个x。这建立了一个最小值列表,然后我选择这些最小值的最大值 有没有更聪明的方
我采用数值方法,在同一区域内使用相同的增量重新创建各个曲线。这可以通过插值实现,其中:
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);
这对我来说非常有效,而且速度非常快。使用polyval
或interp1
循环生成新曲线需要的时间最长,但对于我的68条曲线的数据集和生成10000点的新曲线,在我的第7代Core i7笔记本电脑上从开始到结束只需要0.06秒
更新:相关问题和解决方案,但不适合我。添加它是为了完整性和其他通过此方式的人
在地图上,有人发布了这段代码,以标出曲线上所有曲线图的最大值的路径。要执行最小值,请将最大值更改为最小值:
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个孩子的电话相比,访问曲线要困难一些。关于不同的域,请注意这不会产生最小路径:
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'
总之,这就是完整性。如果曲线在未对齐的情况下,在相同的
x
晶格上取值(即坐标只能在所有曲线的自由度内取相同的离散值),则有一个“更简单”的解决方案,不涉及插值
为便于记法,我假设您的曲线以1xn
struct arrayC
的形式给出,带有x
和y
(其中n
是曲线的数量),因此C(k).x(I)
是k
第条曲线的I
第四坐标:
C =
1xn struct array with fields:
x
y
不同的曲线可以有不同数量的点(即C(k).x
和C(p).x
可以有不同的大小),并且它们可能不对齐。也就是说,如果曲线没有在相同的x
晶格上取值,那么它们需要是一个公共的值,至少在“自由度”的范围内(或者像您那样使用插值的精度更低)
然后,表示“自由度”的下限和上限,您可以使用您建议的最小-最大方法获得红色显示的点:
V = cell(1,n);
for k = 1:n
xk = C(k).x;
V{k} = C(k).y( Dmin <= xk & xk <= Dmax );
% extract those y-values within the DoF
end
% concatenate as a matrix with n rows
V = vertcat(V{:});
max(min(V)) % voila!
V=单元(1,n);
对于k=1:n
xk=C(k).x;
V{k}=C(k).y(Dmin您在问题中描述的步骤似乎是最直接的选择,矢量化时可能会非常快。您的建议对我来说很合适。我将使用interp1
将所有曲线插值到一个公共x轴,然后按照Adrian的建议计算最小值。这样您就不需要(明确地)在x上循环。请注意,这在计算上比绘制线便宜。:)你有所有曲线的函数表示吗?也就是说,不仅仅是数字。在这种情况下,你可以很容易地找到所有曲线的交点,得到阈值以上的最低值,然后找到x-跨度如果你确定最里面的两条线是相交的,你可以在沿阈值的x上找到最大的间隙,即它可以识别所需的两条线。然后,您只需要找到对应线的一个交点。@gnovice谢谢,您将如何设想矢量化?