cómo establecer un elemento vectorial en una estructura mex

cómo establecer un elemento vectorial en una estructura mex


Estoy tratando de llenar una estructura en una función mex. Tengo los conceptos básicos de la estructura creada en mexFunction, pero se vuelve un poco confuso cuando un campo en la estructura es una matriz y quiero completar cada elemento en esta matriz a medida que itera el ciclo 'for'.


....
mxArray *value;
mwSize dims[2] = {16,8};
int numFields = 2;
const char *fieldNames[] = {"array1", "array2"};
plhs[2] = mxCreateStructArray(2, dims, numFields, fieldNames);
for (int i = 0; i < 16; i++)
{
for (int j = 0; j < 8; j ++)
{
value1 = (some calculation);
value = mxCreateDoubleMatrix(1,18,mxREAL);
*mxGetPr(value[sampleIndex]) = value1;
mxSetField(plhs[2], i, "array1", value);
// i want to set the array1[j] element
value2 = (some other calculation);
value = mxCreateDoubleMatrix(1,8,mxREAL);
*mxGetPr(value) = value2;
mxSetField(plhs[2], i, "array2", value);
}
}
....

Los campos "matriz1" y "matriz2" son vectores del mismo tamaño (digamos 8 elementos). No estoy seguro de cómo completar cada elemento individual. ¿Cómo configuro el nombre del campo por el índice de matriz 'j'?


Para ayudar en la explicación, así es como debería verse la estructura:
la estructura es una matriz de 16 elementos, cada elemento tiene 2 campos, cada campo tiene 8 elementos cada uno


structure(0).array1 = [1 2 3 4 5 6 7 8];
structure(0).array2 = [11 12 13 14 15 16 17 18];
structure(1).array1 = [21 22 23 24 25 26 27 28];
structure(1).array2 = [211 212 213 214 215 216 217 218];
structure(2).array1 = [31 32 33 34 35 36 37 38];
structure(2).array2 = [311 312 313 314 315 316 317 318];
structure(3).array1 = [41 42 43 44 45 46 47 48];
structure(3).array2 = [411 412 413 414 415 416 417 418];
...

Los valores son simplemente arbitrarios.


Respuestas:


Considere el siguiente código C:


structArrayMEX.c


#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mxArray *x, *y;
double *xData, *yData;
mwIndex idx, i;
int counter = 1;
// create a 16x1 structure array, each with two fields x and y
const char *fieldNames[] = {"x", "y"};
mxArray *s = mxCreateStructMatrix(16, 1, 2, fieldNames);
// fill structure array
for (idx=0; idx<16; idx++) {
// create x and y matrices each of size 1x8
x = mxCreateDoubleMatrix(1, 8, mxREAL);
y = mxCreateDoubleMatrix(1, 8, mxREAL);
// fill x and y matrices: x[i], y[i]
xData = mxGetPr(x);
yData = mxGetPr(y);
for (i=0; i<8; i++) {
xData[i] = counter;
yData[i] = counter + 100;
counter++;
}
// set fields: s(idx).x = x and s(idx).y = y
mxSetField(s, idx, "x", x);
mxSetField(s, idx, "y", y);
}
// return structure array
plhs[0] = s;
}

La matriz de estructura devuelta:


>> s = structArrayMEX();
>> whos s
Name Size Bytes Class Attributes
s 16x1 4096 struct
>> s(1)
ans =
x: [1 2 3 4 5 6 7 8]
y: [101 102 103 104 105 106 107 108]
>> s(16)
ans =
x: [121 122 123 124 125 126 127 128]
y: [221 222 223 224 225 226 227 228]

La función MEX anterior debe ser equivalente al siguiente código MATLAB


vals = reshape(1:16*8, [8 16])';
s = struct('x',num2cell(vals,2), 'y',num2cell(vals+100,2));