wie man ein Vektorelement in einer mex-Struktur setzt

wie man ein Vektorelement in einer mex-Struktur setzt


Ich versuche, eine Struktur in einer Mex-Funktion zu füllen. Ich habe die Grundlagen der in mexFunction erstellten Struktur, aber es wird ein wenig verwirrend, wenn ein Feld in der Struktur ein Array ist und ich jedes Element in diesem Array füllen möchte, während die 'for'-Schleife iteriert.


....
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);
}
}
....

Die Felder "array1" und "array2" sind beide Vektoren der gleichen Größe (sagen wir 8 Elemente). Ich bin mir nicht sicher, wie ich jedes einzelne Element füllen soll. Wie setze ich den Feldnamen durch den Array-Index 'j'.


Um die Erklärung zu erleichtern, sollte die Struktur so aussehen:
Die Struktur ist ein Array aus 16 Elementen, jedes Element hat 2 Felder, jedes Feld hat jeweils 8 Elemente


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];
...

Die Werte sind nur willkürlich.


Antworten:


Betrachten Sie den folgenden C-Code:


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;
}

Das zurückgegebene Strukturarray:


>> 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]

Die obige MEX-Funktion sollte dem folgenden MATLAB-Code entsprechen


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