首页 > 解决方案 > 数据评估

问题描述

我在 MATLAB 中有一些数据,并且想要区分这些数据超过指定阈值(例如-50)时的起点和终点,并保存它们,然后计算该部分的大致面积,-50如果它低于某个定义的值,则忽略那些点并检查接下来的两点。见下图:

数字

图中左侧两点用x红色标注,所需区域用绿色标注。我想为整个人物做这个。

任何的想法?谢谢。

标签: matlabplotfigure

解决方案


关于绘图,评论中提到了一些可能的方法,而我通常会patch用来绘制填充的多边形区域。对于面积近似,您可以使用trapz函数进行梯形数值积分。

那将是我的解决方案,包括检测间隔,以及忽略面积不足的间隔(它有点长,并且充满了用于绘制所有间隔的循环;当然可以优化):

% Set up function, and parameter(s)
x = linspace(-0.125*pi, 4.125*pi, 10001);
y = linspace(60, 100, 10001) .* sin(x);
thr = -50;
thr_area = 30;

% Find y values lower than threshold
y_idx = find(y <= thr);

% Get start and end of intervals
idx_int = find(diff(y_idx) > 1);
n_int = numel(idx_int)+1;
s = zeros(n_int, 1);
e = zeros(n_int, 1);
s(1) = y_idx(1);
e(end) = y_idx(end);
for k = 1:n_int-1
  e(k) = y_idx(idx_int(k));
  s(k+1) = y_idx(idx_int(k)+1);
end

% Calculate areas
Q = zeros(n_int, 1);
for k = 1:n_int
  Q(k) = abs(trapz(x(s(k):e(k)), y(s(k):e(k))-thr));
end

% Visualization
figure(1);
hold on;
plot(x, y);
xlim([x(1), x(end)]);
ylim([min(y)-10, max(y)+10]);
plot([x(1), x(end)], [thr thr], 'k');
for k = 1:n_int
  patch(x(s(k):e(k)), y(s(k):e(k)), 'k');
  plot([x(s(k)), x(e(k))], [y(s(k)), y(e(k))], 'r.', 'MarkerSize', 15);
  text(x(s(k)), thr+20, num2str(Q(k)));
  if (Q(k) < thr_area)
    text(x(s(k)), thr+10, 'Area too low');
  else
    text(x(s(k)), thr+10, 'Area OK');
  end
end
hold off;

结果如下所示:

输出

您现在应该拥有所有信息,可以进行任何进一步的计算、分析等。

希望有帮助!

免责声明:我使用 Octave 5.1.0 测试了代码,但我很确定它应该完全兼容 MATLAB。如果没有,请发表评论,我会尝试解决可能的问题。


推荐阅读