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

조회 수: 6 (최근 30일)
YIMING
YIMING 2011년 2월 27일
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.

채택된 답변

Jan
Jan 2011년 2월 27일
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
Bruno Luong
Bruno Luong 2011년 2월 27일
If blockDistance remains Matlab code you won't gain any significant in term of speed, as I explained in the News Group.
YIMING
YIMING 2011년 2월 28일
-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?

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

YIMING
YIMING 2011년 2월 27일
The way how to pass an integer from matlab to c has been well studied. My major query is about the cell array.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by