【问题标题】:Call mex Function from cmex SFunction从 c mex S 函数调用 mex 函数
【发布时间】:2015-09-28 14:37:38
【问题描述】:

我已经使用 Visual Studio 2012 实现了一个复杂的mexFunction,并成功地将它与 Matlab 集成。 (我们称之为mexFunctionA.mexw32

当我在 matlab 命令窗口中运行这个命令时,我得到了预期的结果:

mexFunctionA("My1Argument", "My2Argument");

现在,我需要开发一个调用mexFunctionAmexFunctionBmexFunctionB 很简单。

我正在尝试的 C 代码(在 mexFunctionB.c 内)是:

#include "mexFunctionA.mexw32"

(...)

static void mdlOutputs(SimStruct *S, int_T tid)
{
    mexFunctionA("My1Argument", "My2Argument");
}

(...)

这行代码没有编译。

我使用的命令行是:

mex -v mexFunctionB.c -I'C:\patchToMexFunctionA' -L'C:\patchToMexFunctionA' 'mexFunctionA.mexw32'

所以,这里是可能的错误:

  1. #include 方法错误。
  2. 编译代码的命令行错误。
  3. 无法按照我的计划进行。
  4. 别的东西。

有人知道怎么解决吗?

【问题讨论】:

  • 你为什么要这样做?为什么不使用 mexfunction 作为包装器,在里面调用真正的函数?如果你这样做,你就不会有问题,因为你会调用真正的函数,而不是被设计为 MATLAB-C 接口的东西。
  • 这是一个中肯的问题。不知何故很难解释原因,但简单的答案是:这两个函数都访问存储在内存中的一些数据。因此,他们需要访问相同的数据才能产生相同的结果。
  • 如果你有一个函数可以做一些不会改变的事情。我的观点:不要使用mexA-call>mexB 之类的东西@ 987654332@ 其中mexA->funmexB->fun。问题解决了
  • @AnderBiguri :您所说的一切都是正确的,但是由于我的函数的特定实现和要求,调用 mexA->fun 和 mexB->fun 将分配 2 个不同的内存块,因此会产生不同的结果。我应该在我的问题中明确说明这种行为以避免混淆。对不起。

标签: c++ matlab simulink mex s-function


【解决方案1】:

您提供的代码毫无意义。 .mexw32 文件是动态链接的库(即 dll),在 C 代码中 #include 语句不用于包含 dll。

首先请注意,就您的 S-Function 而言,mexFunctionA 与任何其他 MATLAB 函数没有什么不同。所以你应该问的问题是“如何从 mex 文件中调用 MATLAB 函数?”。

答案是使用函数mexCallMATLAB

简而言之,您需要删除#include 并将对mexFunctionA 的调用重新格式化为mexCallMATLAB 所需的格式。

【讨论】:

  • 有道理。我将尝试实施。我会给你反馈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多