You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

核心修复点

  1. 重构event_detection函数

    • 改为返回单条信号的状态值,符合50×1结果矩阵的需求
    • 调整逻辑为:区间内只要有一个信号值超过阈值,就标记为清醒;否则标记为NREM(可根据需求修改判断逻辑,比如取区间最大值、超过阈值的点占比等)
  2. 遍历所有信号

    • 添加循环遍历signals数组的每一行,确保处理全部50条信号,生成50行的结果文件
  3. 修复未定义变量问题

    • 移除原代码中未定义的fft_result参数,改为传入当前处理的signals[i]单条信号数组
  4. 修正索引与写入逻辑

    • 直接将每条信号的状态值写入文件,移除冗余的result_matrix数组,避免索引越界和未初始化内存读取问题
  5. 增强错误处理

    • 添加对start_index和end_index的有效性检查,防止数组越界
    • 完善内存和文件操作的错误处理,避免资源泄漏

内容的提问来源于stack exchange,提问作者MacKenna Bochnak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:35:08