Matlab legacy_code 工具 - 编写包装函数来捕获数组
Matlab legacy_code Tool - Writing a wrapper functio to catch an array
目前我正在尝试通过 Matlab legacy_code 工具在 Matlab/Simulink 中使用基于 C/C++ 代码的库。我对这个很陌生,请耐心等待我。
我偶然发现了这个问题,我有 class 个成员,其中 return 个数组。
我现在所做的是遵循 Matlab 遗留代码示例,尤其是这个:
Integrate External C++ Object Methods
据我所知,legacy_code 工具需要一个包装函数来包装方法调用,所以基本上我可以在这个包装函数中操作 return 的值以任何必要的方式调用方法。到此为止没问题。
但是,我不确定如何从被调用方法接收信息数组,然后将此数组传递给 Matlab/Simulink。
例如方法的 return 值是指向信息数组的指针,让我们假设,我们知道它包含的有效信息的长度。
/* Simple example */
uint8_t* BUS::answerRcvd()
{
static int r[10];
int i;
srand( (unsigned)time( NULL ) );
for ( i = 0; i < 10; ++i)
{
r[i] = rand();
}
return r;
}
有没有办法为这种方法创建一个包装函数来接收一组信息并将其传递给 matlab?
是否有可能处理该数组,例如uint8_t 的单个值(如果方法留在给定的示例中)并像在普通的 matlab 函数中一样传递这些值?
[a,b,c] = function()
我愿意接受任何建议,非常感谢。
好的,看来我找到了解决问题的方法。
作为包装函数,可以使用以下模式
void myfunc(double u1, double u2, double u3, double *y1, double *y2)
{
*y1=u1;
*y2=(u2+u3)/2;
}
此包装函数随后由遗留代码工具 (LCT) 进行接口,如下所示:
def = legacy_code('initialize')
def.OutputFcnSpec = 'void myfunc(double u1, double u2, double u3, double y1[1], double y2[1])'
就这么简单。在 C/C++ 代码中使用指针命名法/语法,在 Matlab 中使用数组命名法/语法。
我希望这能帮助像我这样的人,他们需要一个解决方案来与遗留代码交互,遗留代码不仅应该接受多个输入,还应该接受多个输出。
事后看来,选项 tuuse pointers 非常明显,但如果您不知道如何教您的 LCT 如何与之交互,它很容易成为一项累人的任务。
目前我正在尝试通过 Matlab legacy_code 工具在 Matlab/Simulink 中使用基于 C/C++ 代码的库。我对这个很陌生,请耐心等待我。
我偶然发现了这个问题,我有 class 个成员,其中 return 个数组。
我现在所做的是遵循 Matlab 遗留代码示例,尤其是这个:
Integrate External C++ Object Methods
据我所知,legacy_code 工具需要一个包装函数来包装方法调用,所以基本上我可以在这个包装函数中操作 return 的值以任何必要的方式调用方法。到此为止没问题。
但是,我不确定如何从被调用方法接收信息数组,然后将此数组传递给 Matlab/Simulink。
例如方法的 return 值是指向信息数组的指针,让我们假设,我们知道它包含的有效信息的长度。
/* Simple example */
uint8_t* BUS::answerRcvd()
{
static int r[10];
int i;
srand( (unsigned)time( NULL ) );
for ( i = 0; i < 10; ++i)
{
r[i] = rand();
}
return r;
}
有没有办法为这种方法创建一个包装函数来接收一组信息并将其传递给 matlab?
是否有可能处理该数组,例如uint8_t 的单个值(如果方法留在给定的示例中)并像在普通的 matlab 函数中一样传递这些值?
[a,b,c] = function()
我愿意接受任何建议,非常感谢。
好的,看来我找到了解决问题的方法。
作为包装函数,可以使用以下模式
void myfunc(double u1, double u2, double u3, double *y1, double *y2)
{
*y1=u1;
*y2=(u2+u3)/2;
}
此包装函数随后由遗留代码工具 (LCT) 进行接口,如下所示:
def = legacy_code('initialize')
def.OutputFcnSpec = 'void myfunc(double u1, double u2, double u3, double y1[1], double y2[1])'
就这么简单。在 C/C++ 代码中使用指针命名法/语法,在 Matlab 中使用数组命名法/语法。
我希望这能帮助像我这样的人,他们需要一个解决方案来与遗留代码交互,遗留代码不仅应该接受多个输入,还应该接受多个输出。
事后看来,选项 tuuse pointers 非常明显,但如果您不知道如何教您的 LCT 如何与之交互,它很容易成为一项累人的任务。