通过字段名称传递结构

此示例说明如何从 MATLAB 读取各种类型的结构条目,并将其传递给 C 等效类型变量。

虽然从示例中可以很容易地找出如何通过数字加载字段,但是这里通过将字段名称与字符串进行比较来实现。因此,struct 字段可以通过它们的字段名来寻址,其中的变量可以由 C 读取。

structIn.c

#include "mex.h"
#include <string.h> // strcmp

void mexFunction (int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
  // helpers
  double* double_ptr;
  unsigned int i; // loop variable
  
  // to be read variables
  bool optimal;
  int randomseed;
  unsigned int desiredNodes;

  if (!mxIsStruct(prhs[0])) {
    mexErrMsgTxt("First argument has to be a parameter struct!");
  }
  for (i=0; i<mxGetNumberOfFields(prhs[0]); i++) {
    if (0==strcmp(mxGetFieldNameByNumber(prhs[0],i),"randomseed")) {
      mxArray *p = mxGetFieldByNumber(prhs[0],0,i);
      randomseed = *mxGetPr(p);
    }
    if (0==strcmp(mxGetFieldNameByNumber(prhs[0],i),"optimal")) {
      mxArray *p = mxGetFieldByNumber(prhs[0],0,i);
      optimal = (bool)*mxGetPr(p);
    }
    if (0==strcmp(mxGetFieldNameByNumber(prhs[0],i),"numNodes")) {
      mxArray *p = mxGetFieldByNumber(prhs[0],0,i);
      desiredNodes = *mxGetPr(p);
    }
  }
}

i 上的循环遍历给定结构中的每个字段,而 if(0==strcmp)-parts 将 matlab 字段的名称与给定字符串进行比较。如果匹配,则将相应的值提取到 C 变量。