matlab - 数据评估
问题描述
我在 MATLAB 中有一些数据,并且想要区分这些数据超过指定阈值(例如-50
)时的起点和终点,并保存它们,然后计算该部分的大致面积,-50
如果它低于某个定义的值,则忽略那些点并检查接下来的两点。见下图:
图中左侧两点用x
红色标注,所需区域用绿色标注。我想为整个人物做这个。
任何的想法?谢谢。
解决方案
关于绘图,评论中提到了一些可能的方法,而我通常会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。如果没有,请发表评论,我会尝试解决可能的问题。
推荐阅读
- python - 如何从自定义函数输出熊猫数据框?
- python - 与预测相关的东西
- r - 用 r 中的月份替换 xlimit 值
- javascript - Uncaught TypeError: Object(...) is not a function at HTMLButtonElement.addHandleSubmit
- powerbi - Power BI:如何过滤表以仅显示每个项目的最近日期
- c - 如何根据目标更改 Makefile 依赖文件列表
- opengl - 如何在多个窗口 SFML 和 GLFW 中渲染和获取输入?
- kubernetes - 同集群创建一批Pod,部分Pod启动时间超过40s
- docker - Docker 容器如何解决我的机器上不再工作
- javascript - 检测深度嵌套对象中的更改以使用 Angular 从服务中修改 NgStyle