【发布时间】:2016-12-22 10:18:05
【问题描述】:
我正在尝试构建一个 MEX 文件以在 MATLAB 中调用 Lapack 命令slasd4。构建 mex 文件成功,但是当我尝试使用该命令时,它使 MATLAB 崩溃并以消息结束
异常终止:访问冲突。
谁能帮我解决这个问题?我正在使用带有内置插件的 MATLAB R2016b 来使用 MEX 文件。
这是我的 mex 文件:
#include "mex.h"
#include "lapack.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
mwSize n, i, info = 0;
float *z, *d, *delta, *work, *sigma, rho;
/* verify input/output arguments */
if (nrhs > 4) {
mexErrMsgTxt("Too many input arguments.");
}
if (nlhs > 3) {
mexErrMsgTxt("Too many output arguments.");
}
/* dimensions of input matrix */
n = mxGetN(prhs[0]);
/* create output matrices */
plhs[0] = mxCreateNumericMatrix(n, 1, mxSINGLE_CLASS, mxREAL);
plhs[1] = mxCreateNumericMatrix(n, 1, mxSINGLE_CLASS, mxREAL);
plhs[2] = mxCreateNumericMatrix(1, 1, mxSINGLE_CLASS, mxREAL);
/* get pointers to data */
i = (mwSignedIndex) prhs[3];
d = (float *) mxGetPr(prhs[0]);
z = (float *) mxGetPr(prhs[1]);
rho = (float) mxGetScalar(prhs[2]);
delta = (float *) mxGetPr(plhs[0]);
work = (float *) mxGetPr(plhs[1]);
sigma = (float *) mxGetPr(plhs[2]);
/* Call Lapack function */
slasd4(&n, &i, d, z, delta, &rho, sigma, work, &info);
/* check if call was successful */
if (info < 0) {
mexErrMsgTxt("Illegal values in arguments.");
} else if (info > 0) {
mexErrMsgTxt("Failed to converge.");
}
}
这是一个简单的测试示例:
D = [2; 0];
z = [1;0];
[delta, work, sigma] = slasd4(D,z,-1,1);
这是从故障开始的堆栈跟踪:
[ 0] 0x000000000b8c15b0 C:\Users\Joni\Desktop\NLA\Paper\slasd4.mexw64+00005552 mexfilerequiredapiversion+00000032
[ 1] 0x000000000b8c1561 C:\Users\Joni\Desktop\NLA\Paper\slasd4.mexw64+00005473 mexFunction+00000305
[ 2] 0x00000000fc5fc5d1 C:\Program Files\MATLAB\R2016b\bin\win64\libmex.dll+00116177 mexRunMexFile+00000129
[ 3] 0x00000000fc5fb2e2 C:\Program Files\MATLAB\R2016b\bin\win64\libmex.dll+00111330 mexFeature_mexver+00001794
[ 4] 0x00000000fc5fa506 C:\Program Files\MATLAB\R2016b\bin\win64\libmex.dll+00107782 mexUnlock+00020182
【问题讨论】:
-
我不知道
slasd4在 C 中的正常签名,但事实上你只传递指针已经让我觉得很奇怪...... -
另外,
n未签名 (mwSize),i已签名 (mwSignedIndex),这很奇怪。此外,您不能将指向mxArrays的指针转换为mwSignedIndex以获取它们的大小...您不是要调用mxGetN()吗? -
您能否提供指向在这种情况下使用的
slasd4上的某种文档的链接? -
另外,如果您在 MATLAB 中调用
slasd4(1),您将遇到访问冲突,因为您尚未检查nrhs < 4时会发生什么,但仍直接索引prhs[3]。 -
这是用 Fortran 编写的,但你是用 C 编写的。C 包装器的签名是什么样的?