我编写了一个名为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);
30555x1 single
矩阵1x1 single
变量1x1 double
变量,其值为30555
,即。{
矩阵的大小在迭代中,每次构造厄米特矩阵
应该找到它的特征值和特征向量。所以我在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);}
,这里我得到运行时错误:
并且控件跳转到文件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,我会得到:
如果我按attempt to continue
,我会得到:
所以没有办法看到try, catch and cout
代码抛出了哪个异常。
提示:
basic_schmatrix
是CVM库中的一个类,它封装了复数的Hermitian矩阵。请参阅here,here和here basic_scmatrix
是CVM库中的一个类,它封装了复数的矩阵。请参阅here,here和here,我用它来为Eigenvectors
分配内存,因为它们将以方阵矩阵的形式返回/>
basic_rvector
是CVM库中用于封装实数向量的类。它已被用于为特征值分配内存,因为我们知道埃尔米特矩阵的特征值是真实的,它们将以向量的形式返回
我使用了索引2-4
而不是1-3
,因为我已经解释过here CVM0=1
eig
是类basic_schmatrix
的成员函数,它为特征向量获取已分配内存的地址并返回rvector
类型的对象,请参阅here 编辑:
从我的检查来看,这不是一个错误。控件通常应该达到文件line 311
的{{1}},因为它正在使用动态内存分配,并且在返回到网关函数here's时会释放资源控件的位置列表当你按CVM.h
时,它根本不会抛出异常。但是我的网关功能代码有什么问题导致matlab遇到这样的断点?