繁体   English   中英

如何将float [] []类型数组转换为“ emxArray_real_T * x”

[英]How to convert float[][] type array to “emxArray_real_T *x”

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

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

我得到x是函数的输入,我可以从y得到函数的输出。 问题是我在float [] []中有一个数组,我希望将此数据作为函数的输入,仅将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;
};

基本上,您需要使emxArray*data成员指向float数组。 在C中, float数据以single精度存储。 相应地更新emxArray的其他成员。

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

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

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

第1步:让我们说你有一个浮点数或双数或其他任何数组...它有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] =那个大小..等等..

步骤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中,它也将是行式的...所以仔细阅读它,你有它...你已经执行了matlab中的matlab函数....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM