news 2026/3/10 10:14:12

找出数组中驻点和拐点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
找出数组中驻点和拐点

找出数组中驻点和拐点,即一阶导数为零点和二阶导数为零点。代码定义了两个函数:find_first_deriv_zeros和find_second_deriv_zeros,用于找到一阶和二阶导数的零点索引。主函数中有一个示例数据数组,并调用这两个函数来输出零点的索引。
注意:边界点的处理可能需要特别考虑。例如,一阶导数的左边界使用前向差分,右边界使用后向差分,而中间点使用中心差分。同样,二阶导数的计算也需要处理边界点。

// stdafx.cpp : 只包括标准包含文件的源文件 // ConsoleApplication1.pch 将作为预编译头 // stdafx.obj 将包含预编译类型信息 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> #include <math.h> #define EPSILON 1e-6 // 判断导数为零的阈值 #define MAX_DATA 1000 // 最大数据长度 // 计算一阶导数并返回零点索引 void compute_derivatives(float *data, int n, float *first_deriv, float *second_deriv, int *first_zeros, int *first_count, int *second_zeros, int *second_count) { *first_count = 0; *second_count = 0; if (n < 2) return; // 处理一阶导数 for (int i = 0; i < n; i++) { if (i == 0) { // 左边界前向差分 first_deriv[i] = (data[1] - data[0]) / 1.0f; } else if (i == n-1) { // 右边界后向差分 first_deriv[i] = (data[i] - data[i-1]) / 1.0f; } else { // 中心差分 first_deriv[i] = (data[i+1] - data[i-1]) / 2.0f; } } // 改进的一阶导数零点检测:检查符号变化 for (int i = 0; i < n-1; i++) { // 检查一阶导数是否变号 if (first_deriv[i] * first_deriv[i+1] < 0) { // 一阶导数变号,说明此处有极值点 // 记录i和i+1中函数值更大的点(假设是极大值) int idx = (data[i] > data[i+1]) ? i : i+1; first_zeros[(*first_count)++] = idx; } else if (fabs(first_deriv[i]) < EPSILON) { // 一阶导数恰好为0(平坦区域),直接记录 first_zeros[(*first_count)++] = i; } } // 处理二阶导数 for (int i = 0; i < n; i++) { if (i == 0 || i == n-1) { // 边界使用前向/后向差分 second_deriv[i] = (2.0f*data[i] - 5.0f*data[i+1] + 4.0f*data[i+2] - data[i+3]) / 1.0f; } else if (i == 1) { // 近边界特殊处理 second_deriv[i] = (data[i+1] - 2.0f*data[i] + data[i-1]) / 1.0f; } else if (i == n-2) { // 近边界特殊处理 second_deriv[i] = (data[i+2] - 2.0f*data[i+1] + data[i]) / 1.0f; } else { // 中心差分 second_deriv[i] = (data[i+1] - 2.0f*data[i] + data[i-1]) / 1.0f; } // 记录零点 if (fabs(second_deriv[i]) < EPSILON) { second_zeros[(*second_count)++] = i; } } } int main() { // 示例数据(假设步长h=1) float data[] = {911, 914, 916, 918, 920, 922, 924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 942, 939}; int n = sizeof(data)/sizeof(data[0]); // 导数存储数组 float first_deriv[MAX_DATA] = {0}; float second_deriv[MAX_DATA] = {0}; // 零点索引数组 int first_zeros[MAX_DATA] = {0}; int second_zeros[MAX_DATA] = {0}; int count1 = 0, count2 = 0; // 计算导数和零点 compute_derivatives(data, n, first_deriv, second_deriv, first_zeros, &count1, second_zeros, &count2); // 打印导数信息 printf("索引\t值\t一阶导数\t二阶导数\n"); printf("=====================================\n"); for(int i=0; i<n; i++) { printf("%d\t%.4f\t%.6f\t\t%.6f\n", i, data[i], first_deriv[i], second_deriv[i]); } // 打印零点信息 printf("\n一阶导数零点(驻点)索引: "); for(int i=0; i<count1; i++) printf("%d ", first_zeros[i]); printf("\n二阶导数零点(拐点)索引: "); for(int i=0; i<count2; i++) printf("%d ", second_zeros[i]); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/10 20:05:28

Linux 系统日志完全指南:从 syslogd 到 rsyslog 的深度解析

引言&#xff1a;为什么系统日志如此重要&#xff1f; 作为 Linux 安全专家&#xff0c;我经常告诉同行&#xff1a;“如果你不看日志&#xff0c;你就不知道系统发生了什么&#xff1b;如果你看不懂日志&#xff0c;你就不知道系统正在遭遇什么。” 系统日志是 Linux 系统的&q…

作者头像 李华
网站建设 2026/3/10 1:29:11

YOLOv8在工业流水线产品计数中的应用

YOLOv8在工业流水线产品计数中的应用 在现代工厂的高速传送带上&#xff0c;成百上千件产品以每分钟数十米的速度连续通过——如何在不停机的情况下&#xff0c;精准、实时地统计数量&#xff1f;传统的人工目视或光电传感器计数方式早已难以应对复杂场景&#xff1a;产品堆叠…

作者头像 李华
网站建设 2026/3/9 4:24:42

YOLOv8模型部署到浏览器端的可能性

YOLOv8模型部署到浏览器端的可能性 在智能摄像头、自动驾驶和工业质检等场景中&#xff0c;目标检测早已不是实验室里的概念&#xff0c;而是每天都在运行的关键能力。然而&#xff0c;当我们谈论“AI落地”时&#xff0c;大多数方案仍然依赖服务器推理——图像上传云端&#x…

作者头像 李华
网站建设 2026/3/9 0:02:56

YOLO系列再升级!YOLOv8镜像全面支持GPU加速训练

YOLOv8镜像全面支持GPU加速训练 在智能监控摄像头实时识别行人、工业质检系统自动检测产品缺陷的今天&#xff0c;目标检测早已不再是实验室里的学术玩具&#xff0c;而是驱动无数AI应用落地的核心引擎。然而&#xff0c;哪怕你手握最新论文和强大硬件&#xff0c;真正动手时却…

作者头像 李华
网站建设 2026/3/5 16:46:54

YOLOv8在农业病虫害识别中的创新应用

YOLOv8在农业病虫害识别中的创新应用 在现代农业迈向智能化的今天&#xff0c;一个看似不起眼的问题正困扰着无数农户&#xff1a;如何在广袤的田间快速、准确地发现那些肉眼难辨的病虫害&#xff1f;传统方式依赖农技人员逐片巡检&#xff0c;不仅耗时费力&#xff0c;还容易因…

作者头像 李华
网站建设 2026/3/9 19:52:23

YOLOv8镜像适合AI初学者快速上手机器学习

YOLOv8镜像&#xff1a;让AI初学者真正“跑通第一个模型” 在人工智能的学习路上&#xff0c;很多人卡在了第一步——不是看不懂算法原理&#xff0c;而是根本跑不起来代码。你是否也经历过这样的场景&#xff1a;满怀期待地打开一篇目标检测教程&#xff0c;结果刚运行第一行…

作者头像 李华