我已经转换了一个函数,它使用NxN矩阵作为输入,并使用MatlabCoder从matlab到C给出NxN矩阵输出。 它给了我一个有两个参数的函数,即
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;
};
答案 0 :(得分:4)
基本上,您需要让*data
emxArray
成员指向float
数组。在C中,float
数据存储为single
精度。相应地更新emxArray
的其他成员。
您可能想要结帐MathWorks documentation on the C Code Interface for Arrays
此answer包含与double
数据类型的 C#中实现的完全相同的方案。
答案 1 :(得分:3)
我后来发现我们可以使用以下步骤在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-&gt; 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中,它也将是行式的...所以仔细阅读它,你有它...你已经执行了c ...中的matlab函数。