If the structure is like a.b(1,1).c then how to get the value of 'c' using matlab mex

2 visualizaciones (últimos 30 días)
If the structure is a.b.c then I kow below will be the code:
For a value
const mxArray *L1=mxGetField(*Pointer array, index,"field_name");
For b value
const mxArray *L2= mxGetField(*L1,index,"field_name");
For C value
const mxArray *L3 = mxGetField(*L2, index, "field_name");
But how to acccess data for a.b(1,1).c?
  1 comentario
James Tursa
James Tursa el 13 de Mayo de 2024
Editada: James Tursa el 13 de Mayo de 2024
Please post a small example mat file with a variable that has exactly the layout you are working with, or perhaps some m-code that will build such a small example variable, and then we can post the exact C code to extract what you want.

Iniciar sesión para comentar.

Respuestas (1)

Harsh
Harsh el 8 de Mayo de 2024
Editada: Harsh el 8 de Mayo de 2024
Hi,
From what I can gather, you are working with a mex file and are trying to use the "mxGetField" function to fetch "a.b(1,1).c".
Please follow the following steps to retrieve the value of "a.b(1, 1).c" using the function defined from the mex file.
(sample.c)
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
// Check the number of input and output arguments.
if(nrhs != 1)
mexErrMsgIdAndTxt("MATLAB:mexFunction:invalidNumInputs",
"One input required.");
if(nlhs > 1)
mexErrMsgIdAndTxt("MATLAB:mexFunction:maxlhs",
"Too many output arguments.");
// Assume the input is the structure 'a'.
const mxArray *a = prhs[0];
// Access 'b' field of 'a'.
mxArray *b = mxGetField(a, 0, "b");
if (b == NULL)
mexErrMsgIdAndTxt("MATLAB:mexFunction:fieldNotFound",
"Field 'b' not found.");
// Access 'c' field of 'b'.
mxArray *c = mxGetField(b, 0, "c");
if (c == NULL)
mexErrMsgIdAndTxt("MATLAB:mexFunction:fieldNotFound",
"Field 'c' not found.");
// Assuming 'c' contains a scalar double for simplicity.
if (!mxIsDouble(c) || mxGetNumberOfElements(c) != 1)
mexErrMsgIdAndTxt("MATLAB:mexFunction:invalidField",
"Field 'c' is not a scalar double.");
// Get the value of 'c'.
double value = *mxGetPr(c);
// Return the value of 'c' as output.
plhs[0] = mxCreateDoubleScalar(value);
}
Now, copy the following commands in MATLAB console.
mex sample.c
a.b(1, 1).c = 233;
res = sample(a)
I hope this helps, thanks!
  2 comentarios
Rajesh
Rajesh el 9 de Mayo de 2024
Editada: Rajesh el 9 de Mayo de 2024
Hi Harsh,
Thank you for the help. However, the code you mention for a.b.c. That is already known and the same I mentioned in the description along with the question.
The problem is with the (1,1). it is a nested strcture. First layer is 1x1 strcuture with 4 feilds. The fourth feild has 2x4000 strcture i.e each cell is a structure inside fourth feild. Further, inside each cell structure, there are few values. Can you help me how to extract those values?
Harsh
Harsh el 9 de Mayo de 2024
Editada: Harsh el 9 de Mayo de 2024
Hi Rajesh,
The following code can be used to extract "a.b{1, 2}.c{1, 1}{1, 2}", you can make relevant changes to the following code to extract data from the structure you are working with.
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
// Check the number of input and output arguments.
if(nrhs != 1)
mexErrMsgIdAndTxt("MATLAB:mexFunction:invalidNumInputs",
"One input required.");
if(nlhs > 1)
mexErrMsgIdAndTxt("MATLAB:mexFunction:maxlhs",
"Too many output arguments.");
// Assume the input is the structure 'a'.
const mxArray *a = prhs[0];
mxArray *b = mxGetField(a, 0, "b"); // for a.b
mwSize numRowsA = mxGetM(a);
// Here, we are trying to excess {1, 1}
mwSize rowIdxA = 1;
mwSize colIdxA = 1;
mwIndex bIndex = mxCalcSingleSubscript(b, 0, (mwIndex[]){rowIdxA + colIdxA - 2}); // for a.b{1,1}
mxArray *bB = mxGetCell(b, bIndex);
// get b{1, 2}.c
mwSize rowIdxbB = 1;
mwSize colIdxbB = 2;
mwIndex bBIndex = mxCalcSingleSubscript(bB, 0, (mwIndex[]){rowIdxbB + colIdxbB - 2}); // Convert to linear index
mxArray *c = mxGetCell(bB, bBIndex); // for a.b{1,1}.c
// Get c{1,1}
mwSize rowIdxC = 1;
mwSize colIdxC = 1;
mwIndex cIndex = mxCalcSingleSubscript(c, 0, (mwIndex[]){rowIdxC + colIdxC - 2}); // Convert to linear index
mxArray *cC = mxGetCell(c, cIndex); // for a.b{1,1}.c{1,1}
// Get c{1,1}{1,2}
mwSize rowIdxVal = 1;
mwSize colIdxVal = 2;
mwIndex cCIndex = mxCalcSingleSubscript(cC, 1, (mwIndex[]){rowIdxVal + colIdxVal - 2}); // Convert to linear index
mxArray *val = mxGetCell(cC, cCIndex); // for a.b{1,1}.c{1,1}{1,1}
if (val != NULL && mxIsDouble(val)) {
double value = *mxGetPr(val);
plhs[0] = mxCreateDoubleScalar(value);
}
else
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notDouble", "Cell does not contain a double.");
}
Now, let's create an example struct in MATLAB
c = {115, 111, 112};
b.c = {c, c, c};
a.b = {b, b, b}
Now, copy the following commands in MATLAB console.
mex sample.c
sample(a)
I hope this helps, thanks!

Iniciar sesión para comentar.

Categorías

Más información sobre Write C Functions Callable from MATLAB (MEX Files) en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by