使用mex文件时出现运行时错误,可能是由于内存分配

时间:2017-01-02 08:30:45

标签: c++ matlab visual-studio-2013 linear-algebra mex

我编写了一个名为mx_minimum_power的mex函数,我在MATLAB中调用它如下:

[Fs,Fd,pow_remained] = mx_minimum_power(A11,A12_real,A12_imag,A13_real,A13_imag,A22,A23_real,A23_imag,A33,MatSize);  
  • A11,A12_real,A13_real,A22,A23_real,A33是30555x1 single 矩阵
  • A12_imag,A13_imag,A23_imag为1x1 single变量
  • MatSize是1x1 double变量,其值为30555,即。{ 矩阵的大小

在迭代中,每次构造厄米特矩阵

enter image description here
应该找到它的特征值和特征向量。所以我在CVM Class Library的帮助下编写了以下网关功能。

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    double *arraysizePtr = NULL;
    arraysizePtr = mxGetPr(prhs[9]);
    const int arraysize = (int)*arraysizePtr;
    const int matrixDimention = 3;
    float *inMatrixA11 = (float *)mxGetPr(prhs[0]);
    float *inMatrixA12_real = (float *)mxGetPr(prhs[1]);
    float *inMatrixA12_imag = (float *)mxGetPr(prhs[2]);
    float *inMatrixA13_real = (float *)mxGetPr(prhs[3]);
    float *inMatrixA13_imag = (float *)mxGetPr(prhs[4]);
    float *inMatrixA22 = (float *)mxGetPr(prhs[5]);
    float *inMatrixA23_real = (float *)mxGetPr(prhs[6]);
    float *inMatrixA23_imag = (float *)mxGetPr(prhs[7]);
    float *inMatrixA33 = (float *)mxGetPr(prhs[8]);
    basic_schmatrix< float, complex<float> > A(matrixDimention);
    basic_scmatrix< float, complex<float> > EigenVectors(matrixDimention);
    basic_rvector<float>EigenValues(matrixDimention);
    int i = 0;
    for (i = 0; i < arraysize; i++)
    {
        A.set(2, 2, inMatrixA11[i]);
        A.set(2, 3, complex<float>(inMatrixA12_real[i], inMatrixA12_imag[0]));
        A.set(2, 4, complex<float>(inMatrixA13_real[i], inMatrixA13_imag[0]));
        A.set(3, 3, inMatrixA22[i]);
        A.set(3, 4, complex<float>(inMatrixA23_real[i], inMatrixA23_imag[0]));
        A.set(4, 4, inMatrixA33[i]);
        try{ EigenValues = A.eig(EigenVectors);}
        catch (cvmexception& ex) {
            cout << ex.what() << endl;
        }
    }
}

直到line 28 try{ EigenValues = A.eig(EigenVectors);},这里我得到运行时错误:
enter image description here
并且控件跳转到文件cvm.h的第311行,即以下代码的line 11

CVM_NAMESPACE_BEG  

//! %Array deleter helper class  
template<typename T>
class ArrayDeleter {
public:  
    void operator () (T* d) const {
        if (d != nullptr) {
            ::delete[] d;
        }
    }
};

似乎在将控件返回到网关功能之前导致数组被删除的东西,但我不知道是什么?因为如果我停止调试并返回MATLAB,我会得到:
enter image description here
如果我按attempt to continue,我会得到:
enter image description here
所以没有办法看到try, catch and cout代码抛出了哪个异常。

提示:

  • basic_schmatrix是CVM库中的一个类,它封装了复数的Hermitian矩阵。请参阅hereherehere
  • basic_scmatrix是CVM库中的一个类,它封装了复数的矩阵。请参阅hereherehere,我用它来为Eigenvectors分配内存,因为它们将以方阵矩阵的形式返回/> enter image description here
    其中列是正交特征向量。
  • basic_rvector是CVM库中用于封装实数向量的类。它已被用于为特征值分配内存,因为我们知道埃尔米特矩阵的特征值是真实的,它们将以向量的形式返回
    enter image description here

  • 我使用了索引2-4而不是1-3,因为我已经解释过here CVM0=1

  • Finaly eig是类basic_schmatrix的成员函数,它为特征向量获取已分配内存的地址并返回rvector类型的对象,请参阅here

编辑:
从我的检查来看,这不是一个错误。控件通常应该达到文件line 311的{​​{1}},因为它正在使用动态内存分配,并且在返回到网关函数here's时会释放资源控件的位置列表当你按CVM.h时,它根本不会抛出异常。但是我的网关功能代码有什么问题导致matlab遇到这样的断点?

0 个答案:

没有答案