我有下图,其中绘制了 64 条单独的曲线。这些曲线需要超过一个垂直阈值。超过此阈值的空间宽度显示为 DoF,并由这两条垂直线定位,这两条垂直线可以位于曲线最中心部分与阈值相交的任何位置。
我的问题是如何确定垂直线之间且高于阈值但低于所有曲线的区域的最高点?这可能与交叉点不重合。
曲线没有相同的域(意味着它们的 X 值未对齐)。
我能想到的唯一方法(确实很笨拙)是从左到右循环 x 值,通过在该 x 值处插入一个点来询问每条曲线,获取所有这些值的最小值,然后移动到下一个x。这会构建一个最小值列表,然后我选择这些最小值中的最大值。
是否有更聪明的方法来做到这一点?我可以用绘制的数据来做到这一点吗?这几乎就像我想构建一个形状,然后找到该形状的最大 y 值。
最佳答案
我采用了数值方法,在同一域内并使用相同的增量重新创建各个曲线。这可以通过插值来完成,其中:
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 个点的新曲线,从开始到结束在我的第七代酷睿 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'
无论如何,这都是为了完整性。
关于matlab - 在MATLAB中,如何找到所有这些曲线下间隙最高点的坐标位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51524798/