Matlab crashed when call mexCallMATLAB
이전 댓글 표시
I want to create a new sparse matrix and pass the value of the input sparse matrix to it, and then call mexCallMATLAB to get its transpose. The code crashed,
#include <stdio.h>
#include <stdlib.h>
#include <mex.h>
#include <math.h>
#include <time.h>
#include <string.h>
extern void mexFunction(int iNbOut, mxArray *pmxOut[],
int iNbIn, const mxArray *pmxIn[])
{
mxArray *A, *B;
double *d,*p,*pin,*out;
mwSize m,n,nzmax;
mwIndex *ir, *jc;
m = mxGetM(pmxIn[0]);
n = mxGetN(pmxIn[0]);
nzmax = mxGetNzmax(pmxIn[0]);
ir = mxGetIr(pmxIn[0]);
jc = mxGetJc(pmxIn[0]);
pin = mxGetPr(pmxIn[0]);
A = mxCreateSparse(m, n, nzmax, mxREAL);
mxSetIr(A, ir);
mxSetJc(A, jc);
mxSetPr(A, pin);
d = mxGetPr(A);
B = mxCreateSparse(m, n, nzmax, mxREAL);
mexCallMATLAB(1, &B, 1, &A, "transpose");
p = mxGetPr(B);
pmxOut[0] = mxCreateNumericArray(1 , nzmax, mxSINGLE_CLASS,mxREAL);
out = mxGetPr(pmxOut[0]);
for(mwSize i = 0; i < nzmax; i++)
{
out[i] = p[i];
mexPrintf("pmxOut = %f", out[i]);
}
}
채택된 답변
추가 답변 (2개)
bo bo
2017년 3월 7일
0 개 추천
댓글 수: 1
James Tursa
2017년 3월 7일
편집: James Tursa
2017년 3월 7일
Can you write out, in pseudo-code or descriptions, line by line, what it is you want to do?
The mxCreateSparse function simply gives a bare bones sparse matrix. To get a specific structure you have to manually assign values to the Ir, Jc, Pr, and Pi (if applicable) parts. So if you are trying to duplicate the sparse structure of an existing sparse matrix, you would need to copy over all of the Ir and Jc stuff (as opposed to merely copying the pointers over as you tried to do). A simple way to accomplish all this is to use mxDuplicateArray (but that will copy over all of the Pr and Pi values as well, which may do more work than you want).
If d is a pointer to an existing valid mxArray, you can get its transpose by simply
mxArray *dt;
:
mexCallMATLAB(1, &dt, 1, &d, "transpose");
bo bo
2017년 3월 7일
댓글 수: 2
James Tursa
2017년 3월 7일
편집: James Tursa
2017년 3월 7일
Typo on my part. Use mxCreateNumericMatrix, not mxCreateNumericArray.
Also, I suppose I should point out that nzmax is simply the max amount of non-zeros that can be stored using currently allocated memory. It does not represent how many non-zeros the sparse matrix actually has. To get that number you would do this instead:
mwIndex *jc;
size_t n, nnz;
:
jc = mxGetJc(pmxIn[0]);
n = mxGetN(pmxIn[0]);
nnz = jc[n]; /* The number of non-zero entries in the sparse matrix */
bo bo
2017년 3월 9일
카테고리
도움말 센터 및 File Exchange에서 Write C Functions Callable from MATLAB (MEX Files)에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!