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

8 ビュー (過去 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 Center および File ExchangeFunction Creation についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by