如何从 Matlab 调用具有多个输出的 C++ 函数?

Posted

技术标签:

【中文标题】如何从 Matlab 调用具有多个输出的 C++ 函数?【英文标题】:How to call C++ function with multiple outputs from Matlab? 【发布时间】:2012-04-26 10:02:27 【问题描述】:

我有一个 C++ DLL,我使用 calllib 从 Matlab 代码中调用它。 我可以轻松调用只有输入参数的 C++ 函数或返回 mxArray 的函数。

现在我无法调用具有多个输出参数的函数。比方说,我需要这个 Matlab 函数的 C++ 等效函数,它返回一个矩阵和一个整数。

function [matrix, status] = foo()
status = 42;
matrix = ones(3,2);
end

无论我尝试什么,都会导致 Matlab 崩溃,例如:

DLL_API void foo(mxArray* iop_matrix, int* op_status)
  
  mxSetM(iop_matrix, 3);
  mxSetN(iop_matrix, 2);
  *op_status = 42;
  

但是当我只需要一个输出参数时,我可以很容易地让它工作

DLL_API mxArray* foo(void)
  
  return mxCreateNumericMatrix(3, 2, mxDOUBLE_CLASS, mxREAL);
  

在 C++ 中这样的函数的正确实现是什么?

【问题讨论】:

【参考方案1】:

Matlab 函数的第一个输出参数应声明为 C 函数的输出参数。 Matlab 函数的第二个输出参数应声明为 C 函数的第一个输入参数,其类型为 mxArray **,依此类推。

具有多个输出参数的 C++ 函数应如下所示

mxArray *foo(mxArray **matrix);

如果函数在这种情况下包含输入参数,则函数声明为

mxArray *foo(mxArray **matrix, mxArray *_1stInpParam, mxArray *_2ndInpParam);

【讨论】:

以上是关于如何从 Matlab 调用具有多个输出的 C++ 函数?的主要内容,如果未能解决你的问题,请参考以下文章

从 Matlab 调用的 Mex 函数和数值差异

如何从 C++ 执行 Matlab 脚本

如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?

linux c++ 怎么 调用自己函数的

如何查看从 Matlab 中 Mex 函数使用的 DLL 调用的 printf 的输出?

使用带有 MEX Wrapper 的辅助 C 文件从 MATLAB 2016 调用 C++ 代码时遇到问题