3

我已经使用 MatlabCoder 转换了一个函数,该函数将 NxN 矩阵作为输入并将 NxN 矩阵输出从 matlab 到 C。它给了我一个有两个参数的函数,即

void func(const emxArray_real_T *x, emxArray_real_T *y)

我知道 x 是函数的输入,我可以从 y 获得函数的输出。问题是我在 float[][] 中有一个数组,我希望将此数据作为 func 的输入,它仅将 emxArray_real_T *x 作为输入。

关于如何将此 float[][] 数据转换为 emxArray_real_T *x 的任何想法

emxArray_real_T 有这个结构

struct emxArray_real_T
{
    real_T *data;
    int32_T *size;
    int32_T allocatedSize;
    int32_T numDimensions;
    boolean_T canFreeData;
};
4

2 回答 2

5

基本上你需要有指向数组的*data成员。在 C 中,数据以精度形式存储。相应地更新其他成员。emxArrayfloatfloatsingleemxArray

您可能需要查看有关数组的 C 代码接口的 MathWorks 文档

这个答案包含在C#中为double数据类型实现的完全相同的场景。

于 2013-08-17T09:03:19.383 回答
3

后来我发现我们可以使用以下步骤将任何数据创建到 emxArray_real_T * 中......

第 1 步:假设您有一个带有 float 或 double 或其他任何东西的数组......它是 2 维的......它可以是任何尺寸的......它可以是 3 ..它可以是 4 ......现在第一步是声明

emxArray_real_T *x, *y;

其中 x 将是您的输入,您将在 y 中获得输出...

现在到现在为止,我们只声明了变量,并没有在其中设置任何尺寸或任何大小......

第2步:在与您要调用的函数相同的文件中应该有这些函数..如果没有,那么您必须声明它们....

 static void emxInit_real_T(emxArray_real_T **pEmxArray, int32_T numDimensions)
 {
   emxArray_real_T *emxArray;
   int32_T i;
   *pEmxArray = (emxArray_real_T *)malloc(sizeof(emxArray_real_T));
   emxArray = *pEmxArray;
   emxArray->data = (real_T *)NULL;
   emxArray->numDimensions = numDimensions;
   emxArray->size = (int32_T *)malloc((uint32_T)(sizeof(int32_T) * numDimensions));
   emxArray->allocatedSize = 0;
   emxArray->canFreeData = TRUE;
   for (i = 0; i < numDimensions; i++) {
     emxArray->size[i] = 0;
   }
 }

现在您可以按以下方式初始化变量“x,y”

emxInit_real_T(&x, 2);
emxInit_real_T(&y, 2);

这里 2 是我们想要作为输入或输出的矩阵的维度。

第 3 步:在我的情况下,x 的维度是 2,所以我要做的是这样说我的输入是 n*n 矩阵,所以我会这样做

x->size[0]=n;
x->size[1]=n;

同样对于 y

y->size[0]=n;
y->size[1]=n;

如果你有 3 或 4 维那么你可以放更多像 x->size[2]=that size.. 等等..

第4步:现在我们已经确保程序为这些变量分配了指定的内存,因此应该有一个如下所示的函数。如果没有,那么你必须声明它......

static void emxEnsureCapacity(emxArray__common *emxArray, int32_T oldNumel,
  int32_T elementSize)
{
  int32_T newNumel;
  int32_T i;
  void *newData;
  newNumel = 1;
  for (i = 0; i < emxArray->numDimensions; i++) {
    newNumel *= emxArray->size[i];
  }

  if (newNumel > emxArray->allocatedSize) {
    i = emxArray->allocatedSize;
    if (i < 16) {
      i = 16;
    }

    while (i < newNumel) {
      i <<= 1;
    }

    newData = calloc((uint32_T)i, (uint32_T)elementSize);
    if (emxArray->data != NULL) {
      memcpy(newData, emxArray->data, (uint32_T)(elementSize * oldNumel));
      if (emxArray->canFreeData) {
        free(emxArray->data);
      }
    }

    emxArray->data = newData;
    emxArray->allocatedSize = i;
    emxArray->canFreeData = TRUE;
  }
}

为此,应该有结构名称 emxArray__common 如下所示,如果没有,则如下声明

struct emxArray__common
{
  void *data;
  int32_T *size;
  int32_T allocatedSize;
  int32_T numDimensions;
  boolean_T canFreeData;
};
typedef struct emxArray__common emxArray__common;

第5步:然后这样做..

emxEnsureCapacity((emxArray__common *)x, 0, (int32_T)sizeof(real_T));
emxEnsureCapacity((emxArray__common *)y, 0, (int32_T)sizeof(real_T));

现在这两个变量都有指定的 n*n 内存。现在输入数据将保存在 x... 的数据中,它将按行保存。

x->data[i*n+j]=input_data[i][j];

如果你明白我的意思。现在您可以在要调用的函数中传递 x 和 y,然后返回的数据将在 y 中,并且它也将是逐行的。所以仔细阅读它,然后你就拥有它了……你已经执行了c中的matlab函数......

于 2013-08-18T11:05:58.383 回答