How do I pass a cell array from matlab to c code?

9 visualizaciones (últimos 30 días)
YIMING
YIMING el 27 de Feb. de 2011
Hi every one,
my code snippet in matlab is,
L = zeros(numBlocksN, numBlocksO);
for r = 1:numBlocksN
for c = 1:numBlocksO
[rcEmd] = blockDistance(cell1{r}, cell2{c});
L(r,c) = rcEmd;
end
end
where numBlocksN & numBlocksO are constants, and cell1 & cell2 are cell arrays and the element of each (i.e., cell1{r} & cell2{c}) are structure arrays. The blockDistance inside loop is a self-defined fuction which computes the distance between cell1{r} and cell2{c}.
As is known, it is time-consuming to use loops in Matlab. So I want to translate this particular snippet into c source. I need to pass the integers numBlocksN, numBlocksO and two cell arrays ( cell1 and cell2 ) into c as arguments. And also, I want return the computed result L which carries the distance between each cell1{r} and cell2{c}. Could anyone kindly point out me a way to achieve this? Many thanks in advance.

Respuesta aceptada

Jan
Jan el 27 de Feb. de 2011
Cell arrays are passed exactly as any other type. I assume, your question concerns the usage of a cell inside a C-mex.
mxArray *c1, *c2;
double *OutputPtr;
plhs[0] = mxCreateDoubleMatrix(numBlocksN, numBlockO, mxREAL);
OutputPtr = mxGetPr(plhs[0]);
for (r = 0; r < numBlocksN; r++) {
c1 = mxGetCell(prhs[2], r);
for (c = 0; c < numBlocksO; c++) {
c2 = mxGetCell(prhs[3], c);
*OutputPtr++ = blockDistance(c1, c2); % EDITED: * added
end
end
Now lockDistance(c1, c2) gets pointers to the cell elements. Depending on your function lockDistance, you might need further e.g. mxGetPr calls.
BTW, your M-version can be made a littlte bit faster also:
L = zeros(numBlocksN, numBlocksO);
for c = 1:numBlocks0
c2 = cell2{c};
for r = 1:numBlocksN
L(r,c) = blockDistance(cell1{r}, c2);
end
end
In addition I would inline blockDistance and I guess it can be vectorized.
  5 comentarios
Bruno Luong
Bruno Luong el 27 de Feb. de 2011
If blockDistance remains Matlab code you won't gain any significant in term of speed, as I explained in the News Group.
YIMING
YIMING el 28 de Feb. de 2011
-To Jan Simon,
Actually my function 'blockDistance' is a matlab one (yet very simple, should not be time-consuming). I did the following things to call it in my c source,
mxArray *arguments[2];
arguments[0] = c1;
arguments[1] = c2;
mexCallMATLAB(1, lData++, 2, arguments, "blockDistance");
However the compiler returns me error. What's wrong with my code?

Iniciar sesión para comentar.

Más respuestas (1)

YIMING
YIMING el 27 de Feb. de 2011
The way how to pass an integer from matlab to c has been well studied. My major query is about the cell array.

Categorías

Más información sobre Function Creation en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by