c - 段错误

标签 c matlab segmentation-fault mex

我正在尝试为 RLS 过滤器编写 MATLAB/mex 代码来练习我的 C,当然还有在我设法实现它后加快代码速度。但是,在尝试使用输入运行以下代码时出现段错误。

#include <math.h>
#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{       
    /* Macros for input data */
    #define xData prhs[0] /* Input signal to filter */
    #define dData prhs[1] /* Desired output signal */
    #define deltaData prhs[2] /* For initializing covariance matrix */
    #define lambdaData prhs[3] /* Forgetting factor */
    #define MData prhs[4] /* Filter order */

    /* Macros for output data */
    #define wData plhs[0] /* Final filter coefficients */
    #define yData plhs[1] /* Filter output signal vector */
    #define eData plhs[2] /* Error vector */
    #define WData plhs[3] /* Filter coefficients matrix */

    /* Variables */
    mxArray *xT, *P, *q, *k; /* Temp arrays */
    double *xr, *xi, *dr, *di, delta, lambda;
    double *Pr, *Pi, *qr, *qi, *kr, *ki, *xTr, *xTi, den;
    double *wr, *wi, *yr, *yi, *er, *ei, *Wr, *Wi;
    int M, Mx, Md, Nx, Nd, m, n, m1, m2, nT, l;

    /* Get pointers to input data */
    xr = mxGetPr(xData); /* Real */
    xi = mxGetPi(xData); /* Imag */
    dr = mxGetPr(dData); /* Real */
    di = mxGetPi(dData); /* Imag */
    delta = mxGetScalar(deltaData);
    lambda = mxGetScalar(lambdaData);
    M = (int)mxGetScalar(MData);

    /* Get dimensions of input data */
    Mx = mxGetM(xData); /* Number of rows in x */
    Nx = mxGetN(xData); /* Number of columns in x */
    Md = mxGetM(dData); /* Number of rows in d */
    Nd = mxGetN(dData); /* Number of columns in d */

    /* Temporary vector - size M-by-1 */
    xT = mxCreateDoubleMatrix(M, 1, mxCOMPLEX);
    xTr = mxGetPr(xT); /* Real */
    xTi = mxGetPi(xT); /* Imag */

    /* Covariance matrix - size M-by-M */
    P = mxCreateDoubleMatrix(M, M, mxCOMPLEX);
    Pr = mxGetPr(P); /* Real */
    Pi = mxGetPi(P); /* Imag */

    /* Temporary vector for computing gain vector - size M-by-1 */
    q = mxCreateDoubleMatrix(M, 1, mxCOMPLEX);
    qr = mxGetPr(q); /* Real */
    qi = mxGetPi(q); /* Imag */

    /* Gain vector - size M-by-1 */
    k = mxCreateDoubleMatrix(M, 1, mxCOMPLEX);
    kr = mxGetPr(k); /* Real */
    ki = mxGetPi(k); /* Imag */

    /* Create output vector - size Mx-by-1 */
    yData = mxCreateDoubleMatrix(Mx, 1, mxCOMPLEX); 
    yr = mxGetPr(yData); /* Real */
    yi = mxGetPi(yData); /* Imag */

    /* Create error vector - size Mx-by-1 */
    eData = mxCreateDoubleMatrix(Mx, 1, mxCOMPLEX); 
    er = mxGetPr(eData); /* Real */
    ei = mxGetPi(eData); /* Imag */

    /* Create coeff. vector - size M-by-1 */
    wData = mxCreateDoubleMatrix(M, 1, mxCOMPLEX); 
    wr = mxGetPr(wData); /* Real */
    wi = mxGetPi(wData); /* Imag */

    /* Create coeff. matrix - size M-by-Mx */
    WData = mxCreateDoubleMatrix(M, Mx, mxCOMPLEX); 
    Wr = mxGetPr(WData); /* Real */
    Wi = mxGetPi(WData); /* Imag */

    m2 = 0;
    /* Initialize covariance matrix */
    for(m1 = 0; m1 < M; m1++, m2++)
    {
        Pr[m1*M+m2] = (1/delta); /* diag(P) = (1/delta) */
        Pi[m1*M+m2] = (1/delta); /* diag(P) = (1/delta) */
    }

    for(n = 0; n < Mx; n++)
    {
        /* Compute xT_m = [x[n] x[n-1] .... x[n-(M-1)]] */
        for(m = 0; m < M; m++)
        {/* Assume zeros outside available data and zero-fill*/
            if(n < (M-1)) 
            {
                nT = n;
                for(l = 0; l < M; l++)
                {
                     xTr[l] = xr[nT]; /* Real */
                     xTi[l] = xi[nT]; /* Imag */
                     if(nT == 0)
                         break;
                     else
                         nT--;
                 }
            } /* Data available for all lags */
            else 
            {   
                 xTr[m] = xr[n-m]; /* Real */
                 xTi[m] = xi[n-m]; /* Imag */
            }
            /* Set to zero prior to filling for computing gain vector */
            qr[m] = 0; /* Real */
            qi[m] = 0; /* Imag */
        }
    }
    return;
}

Atm 我删掉了大量代码,因为我设法找出了错误的来源;如果我在下面的代码中注释掉以下部分,它就会运行(但对我来说没有用)。我试图打印出数组中使用的索引,看看其中一个是否变为负数,但没有成功。所以我真的找不到错误。很可能是一些愚蠢的事情,但我就是找不到错误是什么。我还在另一个函数(用于 LMS 过滤器)中使用了下面相同的代码片段,它在那里正常工作。这两个函数之间的主要区别在于处理所需的临时数组的数量。所以最大的问题是:有没有人看到代码中有任何明显的错误会导致段。过错? (否则,我知道代码可能不如它所能做到的那么好,但我假设,当我编写更多 C 代码时,这会随着时间的推移而到来)。

for(m = 0; m < M; m++)
{/* Assume zeros outside available data and zero-fill*/
    if(n < (M-1)) 
    {
        nT = n;
        for(l = 0; l < M; l++)
        {
            // xTr[l] = xr[nT]; /* Real */
            // xTi[l] = xi[nT]; /* Imag */
            if(nT == 0)
                break;
            else
                nT--;
            }
    } /* Data available for all lags */
    else 
    {   
            // xTr[m] = xr[n-m]; /* Real */
            // xTi[m] = xi[n-m]; /* Imag */
    }
    /* Set to zero prior to filling for computing gain vector */
    qr[m] = 0; /* Real */
    qi[m] = 0; /* Imag */
}

最佳答案

你确实有很多指针,所以它们中的任何一个都可能导致段错误。

从您所做的调试来看,问题很可能出在以下几点之一:

xTr、xTi、xr 或 xi;

所有这些都使用函数 mxGetPr() 或 mxGetPi() 进行初始化。不知道它做了什么,就不可能确定。你确定它返回一个指向数组的指针吗?你确定两个数组至少有 m 个元素吗?

那里的结构相当复杂,因此要全面分析所有指针以找出错误是一项复杂的工作。

关于c - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884482/

相关文章:

java - 任何现有的 java 或 matlab 库都可以计算房间中有多少人使用 IP 摄像机?

c++ - 段。由指向结构指针的 vector 的指针引起的退出错误

linux - 段错误 11 在 mac 中,但在 linux 中没有,gcc 编译器

c - 覆盖内存?在C中使用malloc,调用结构体时

c - 全屏显示带边框的控制台,c编程

c - GTK3.0 GUI 在使用 "g_spawn_async_with_pipes()"时卡住

matlab - 图像分割后的高效分割边界标记

matlab - 如何在 MEX 函数中读取整数数组

c - 内存集和 SIGSEGV

c - C中奇怪的#define语句