将 C++ MEX 文件中的值返回到 MATLAB

Posted

技术标签:

【中文标题】将 C++ MEX 文件中的值返回到 MATLAB【英文标题】:Return values from a C++ MEX file to MATLAB 【发布时间】:2015-08-03 09:08:02 【问题描述】:

我正在编写一个从 C++ 代码中检索数据的 MATLAB 程序。为此,我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction。 尽管可以在 MATLAB 中读取读取的值,但我无法检索它来使用它。如果不清楚,我的问题与此处 (How to return a float value from a mex function, and how to retrieve it from m-file?) 完全相同,但我想检索我的 C++ 程序显示的值。 这是我的 C++ 代码:

#define _AFXDLL
#define  _tprintf mexPrintf
#include "StdAfx.h"
#include "704IO.h"
#include "Test704.h"
#include "mex.h"
#ifdef _DEBUG
  #define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////

CWinApp theApp;  // The one and only application object

/////////////////////////////////////////////////////////////////////////////

using namespace std;

/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, TCHAR *argv[], TCHAR *envp[])
//void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

HMODULE hModule(::GetModuleHandle(NULL));
short   valueRead;

  if (hModule != NULL)
  
    // Initialize MFC and print and error on failure
    if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
    
      //mexPrintf("Fatal Error: MFC initialization failed");
      //nRetCode = 1;
    
    else
    
        valueRead = PortRead(1, 780, -1);
        mexPrintf("Value Read = %i\n",valueRead);
    
  
  else
  
    _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
  
  //return nRetCode;


/////////////////////////////////////////////////////////////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    _tmain(0,0,0);
    return;

如果您需要有关我的问题的更多信息,请告诉我?

【问题讨论】:

在您发布的链接中,答案非常好,尽其所能。有什么问题? 这确实非常好,但对我来说不合适:我想从 _intmain() 中检索值,它应该读取设备的输出和更改。在我发布的链接中给出的解决方案中,该值在代码中“几乎”给出,我不希望这样。 你几乎是什么意思?它只是一个数字,你也可以这样做。而不是 data[0] = 1; ,请执行 data[0]=_tmain(0,0,0) (或您想要返回的任何其他值)。 对我来说几乎不意味着该值包含在代码中。我已经尝试过data[0]=_tmain(0,0,0),但它只是返回值 0 而 Test704() 的返回值为 1。 然后给我们看代码!您需要显示所有代码,否则我们无法帮助您!您显示的代码中没有Test704() ,您也没有尝试返回任何值! 【参考方案1】:

要向 Matlab 返回一个整数,您可以按照您发布的链接的说明进行操作,但对其稍作修改,以便返回整数。

void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[])

    // Create a 1-by-1 real integer. 
    // Integer classes are mxINT32_CLASS, mxINT16_CLASS, mxINT8_CLASS
    // depending on what you want.
    plhs[0] = mxCreateNumericMatrix(1, 1, mxINT16_CLASS, mxREAL);


    // fill in plhs[0] to contain the same as whatever you want 
    // remember that you may want to change your variabel class here depending on your above flag to *short int* or something else.
    int* data = (int*) mxGetData(plhs[0]); 
    // This asigns data the same memory address as plhs[0]. the return value

    data[0]=_tmain(0,0,0); //or data[0]=anyFunctionThatReturnsInt();
    return;


【讨论】:

非常感谢!它确实有帮助,但我的问题解决了一半:_tmain() 中没有返回任何值,所以现在它可以正常工作了。

以上是关于将 C++ MEX 文件中的值返回到 MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

Fortran Mex 文件 - 传回 Matlab 的值不正确

为啥到达 MEX 文件的最后一行后返回 Matlab 需要这么长时间?

mex 文件崩溃,如何在 matlab 中使用 MATLAB_MEM_MGR?

在 Windows 上使用 GFortran 在 Matlab 中创建 Mex 文件

Mex 文件执行中的错误,Matlab 窗口

未找到 Mexopencv mex 文件