Is there an easy way to copy part of an array using mex functions?
Afficher commentaires plus anciens
I'm aware of mxDuplicateArray to copy a whole mxArray, but if I just one to copy just one "column" or "row" of an mxArray, is there a helper mex function for this?
In other words, is there a mex function equivalent to:
B = A(:, i);
C = A(i, :);
etc.
Réponses (2)
James Tursa
le 13 Juin 2013
1 vote
There is no mex API function for this directly, but it would be easy to accomplish a simply copy (e.g., a single column) with a few lines of code. The challenge would be how robust you want the code to be in more general cases. E.g., do you want it to handle all class of variables (not just double)? All possible dimensions? Complex? Sparse? Etc.
If you need help with code for a specific copy (e.g., single row or column) let me know.
5 commentaires
Robert
le 13 Juin 2013
Robert
le 13 Juin 2013
Jan
le 19 Juin 2013
A Matlab array is an array, which can be used inside Matlab. It can have different types and has a header, which is used internally in Matlab. A C-array is a pure bolck of reserved memory.
mxArray *MatlabArray;
double *CArray;
MatlabArray = mxCreateDoubleMatrix(2,4, mxREAL);
CArray = (double *) mxMalloc(2 * 4 * sizeof(double));
Robert
le 19 Juin 2013
To copy a subvector to a new Matlab array:
mxArray *A, *B, *C;
mwSize s1, s2, i;
double *Ap, *Cp;
A = (mxArray *) prhs[0]; // The 1st input, ignore const qualifier
Ap = mxGetPr(A);
s1 = mxGetM(A);
s2 = mxGetN(A);
// B = A(:, i)
B = mxCreateDoubleMatrix(s1, 1, mxREAL);
memcpy(mxGetPr(B), Ap+(i-1)*s1, s1 * sizeof(double)); % EDITED
// C = A(i, :)
C = mxCreateDoubleMatrix(1, s2, mxREAL);
Cp = mxGetPr(C);
for (i = 0; i < s2; i++) {
Cp[i] = Ap[i * s1];
}
This is not tested! Please check this for typos carefully.
8 commentaires
Jan
le 19 Juin 2013
Any comments, Robert?
Robert
le 19 Juin 2013
Robert
le 19 Juin 2013
James Tursa
le 19 Juin 2013
i'th column (i is 1-based per the comment):
// B = A(:, i)
B = mxCreateDoubleMatrix(s1, 1, mxREAL);
memcpy(mxGetPr(B), Ap+(i-1)*s1, s1 * sizeof(double));
Jan
le 19 Juin 2013
Thanks, James. I've inserted this in the [EDITED] line. My original line did not contain any dependency to "i" and this was obviously wrong.
Robert
le 20 Juin 2013
James Tursa
le 20 Juin 2013
mxGetM would crash MATLAB if you passed an invalid pointer to it, or if something upstream corrupted memory and mxGetM just happened to be the point at which the crash finally happened. You will probably need to post your code (not just a code snippet) for us to look at.
Jan
le 20 Juin 2013
A = (mxArray *) prhs[0]; n=mxGetN(A); could fail, when you call the MEX without input arguments, because A is a null pointer then. I cannot test this currently, but as far as I remember mxGetM/N does not test this before.
Catégories
En savoir plus sur Write C Functions Callable from MATLAB (MEX Files) dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!