私はMATLABのLapackコマンドslasd4
を呼び出すためにMEXファイルを構築しようとしています。 mexファイルの構築は成功しますが、コマンドを使用しようとするとMATLABがクラッシュし、メッセージで終了します。アクセス違反の終了slasd4 mex
異常終了:アクセス違反。
誰でもこの問題を解決できますか?私は、MEXファイルを使用するための組み込みアドオンでMATLAB R2016bを使用しています。ここで
は私の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.");
}
}
は簡単なテストの例です:に関連する
[ 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
'あなたがそれを渡しているという事実はすでに私を奇妙なものにしています... –
また、 'n'は符号なし(' mwSize')、 'i'は署名されています(' mwSignedIndex')、それは奇妙です。さらに、 'mxArrays'へのポインタを' mwSignedIndex'にキャストしてサイズを取得することはできません。 'mxGetN()'を呼び出すことを意味しませんか? –
この種のコンテキストで使用される 'slasd4'のドキュメントにリンクできますか? –