c - 如何在 mex 结构中设置 vector 元素

标签 c arrays matlab structure mex

我正在尝试在 mex 函数中填充结构。我掌握了在 mexFunction 中创建的结构的基础知识,但是当结构中的字段是数组并且我想在“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);


    }
}
....

字段“array1”和“array2”都是相同大小的 vector (可以说是 8 个元素)我不确定如何填充每个单独的元素。我如何通过数组索引“j”设置字段名称。

为了帮助解释,结构应该是这样的: structure是一个16个元素的数组,每个元素有2个字段,每个字段各有8个元素

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

这些值是任意的。

最佳答案

考虑以下 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;
}

返回的结构数组:

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

上面的 MEX 函数应该等价于下面的 MATLAB 代码

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

关于c - 如何在 mex 结构中设置 vector 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10714583/

相关文章:

java - 使用简单的数组通过堆叠对数字进行排序?

javascript - 如何根据属性值合并两个javascript数组?

matlab - 在 MATLAB 中将两个非常大的稀疏矩阵相乘时出现内存不足错误

matlab - 如何修复 Matlab eps 文件中的虚线间距

matlab - 如何在mac终端运行matlab脚本

c - 终端中带有 C 的文本文件

c - C 中的本地 int 与 Global int

c++ - 我可以将 std::vector<int>* 转换为 int* 吗?

c - C语言中删除字符串中的字母

c - 在 C 中存储和处理大数