EEG睡眠信号事件检测for循环异常,结果矩阵不符合预期求助
修复EEG睡眠信号分类的C语言代码问题
需求说明
- 加载含50行3000列的CSV文件,每行对应一条EEG睡眠信号
- 区分状态:信号值>0.00046标记为1(清醒),否则标记为2(NREM睡眠)
- 仅分析500ms-2500ms区间的信号
- 最终生成50×1的结果矩阵(每条信号对应一个状态值)
现有代码
//Event detection void event_detection(double signal[], int result_matrix[], int length, double threshold, int start_index, int end_index) { for (int i = start_index; i <= end_index; i++) { printf("%lf\n", signal[i]); // Print for debugging // Assuming fft_result contains magnitudes of relevant frequencies if (signal[i] > threshold) { result_matrix[i] = 1; // Awake } else { result_matrix[i] = 2; // Non-REM sleep } } } int main(int argc, char* argv[]) { FILE* file = fopen("EEG_SleepData_30sec_100Hz.csv", "r"); if (file == NULL) { perror("Error opening file"); return EXIT_FAILURE; } // Load the CSV file into a 2D array int num_signals = num_rows_in_file(file); int signal_length = num_cols_in_file(file); printf("Number of rows = %d Number of columns = %d\n", num_signals, signal_length); rewind(file); double** signals = load_data(file, num_signals, signal_length); fclose(file); // Parameters for event detection double threshold = 0.00046; int start_index = 500; int end_index = 2500; // Open the CSV file for writing the result FILE* result_file = fopen("result_signal.csv", "w"); if (result_file == NULL) { perror("Error opening result file"); free_2d_array(signals, num_signals); return EXIT_FAILURE; } // Perform event detection int* result_matrix = (int*)malloc(signal_length * sizeof(int)); if (result_matrix == NULL) { fprintf(stderr, "Memory allocation failed\n"); return EXIT_FAILURE; } event_detection(fft_result, result_matrix, signal_length, threshold, start_index, end_index); // Write the result matrix to the result file for (int j = 0; j < (end_index - start_index + 1); j++) { fprintf(result_file, "%d\n", result_matrix[j]); } } fclose(result_file); free_2d_array(signals, num_signals); return 0; }
问题描述
当前event_detection函数的for循环调试时返回数据错误,生成的结果矩阵不符合50×1的需求,且存在逻辑、变量未定义、索引错误等问题。
修复方案
修复后的完整代码
#include <stdio.h> #include <stdlib.h> // 假设以下辅助函数已正确实现 int num_rows_in_file(FILE* file); int num_cols_in_file(FILE* file); double** load_data(FILE* file, int num_rows, int num_cols); void free_2d_array(double** arr, int num_rows); // 针对单条EEG信号,分析500ms-2500ms区间,返回状态(1=清醒,2=NREM) int event_detection(double signal[], double threshold, int start_index, int end_index) { // 逻辑:区间内存在任意信号值超过阈值则标记为清醒 for (int i = start_index; i <= end_index; i++) { // printf("%lf\n", signal[i]); // 调试用,可注释 if (signal[i] > threshold) { return 1; } } return 2; } int main(int argc, char* argv[]) { FILE* file = fopen("EEG_SleepData_30sec_100Hz.csv", "r"); if (file == NULL) { perror("Error opening file"); return EXIT_FAILURE; } int num_signals = num_rows_in_file(file); int signal_length = num_cols_in_file(file); printf("Number of rows = %d Number of columns = %d\n", num_signals, signal_length); rewind(file); double** signals = load_data(file, num_signals, signal_length); if (signals == NULL) { fprintf(stderr, "Failed to load data\n"); fclose(file); return EXIT_FAILURE; } fclose(file); double threshold = 0.00046; int start_index = 500; int end_index = 2500; // 检查区间有效性,防止数组越界 if (start_index < 0 || end_index >= signal_length || start_index > end_index) { fprintf(stderr, "Invalid start/end index range\n"); free_2d_array(signals, num_signals); return EXIT_FAILURE; } FILE* result_file = fopen("result_signal.csv", "w"); if (result_file == NULL) { perror("Error opening result file"); free_2d_array(signals, num_signals); return EXIT_FAILURE; } // 遍历所有50条信号,逐一处理并写入结果 for (int i = 0; i < num_signals; i++) { int status = event_detection(signals[i], threshold, start_index, end_index); fprintf(result_file, "%d\n", status); } // 资源清理 fclose(result_file); free_2d_array(signals, num_signals); return 0; }
核心修复点
重构
event_detection函数- 改为返回单条信号的状态值,符合50×1结果矩阵的需求
- 调整逻辑为:区间内只要有一个信号值超过阈值,就标记为清醒;否则标记为NREM(可根据需求修改判断逻辑,比如取区间最大值、超过阈值的点占比等)
遍历所有信号
- 添加循环遍历
signals数组的每一行,确保处理全部50条信号,生成50行的结果文件
- 添加循环遍历
修复未定义变量问题
- 移除原代码中未定义的
fft_result参数,改为传入当前处理的signals[i]单条信号数组
- 移除原代码中未定义的
修正索引与写入逻辑
- 直接将每条信号的状态值写入文件,移除冗余的
result_matrix数组,避免索引越界和未初始化内存读取问题
- 直接将每条信号的状态值写入文件,移除冗余的
增强错误处理
- 添加对
start_index和end_index的有效性检查,防止数组越界 - 完善内存和文件操作的错误处理,避免资源泄漏
- 添加对
内容的提问来源于stack exchange,提问作者MacKenna Bochnak
相关产品推荐
相关产品推荐

