MATLAB数据从内存地址检索?

时间:2017-08-01 15:20:09

标签: c++ arrays matlab mex

对于这篇文章的篇幅感到抱歉,但我们有一个非常具体的场景,我想提供尽可能详细的信息。

我们正在尝试编写一个MATLAB程序来控制和处理来自Newport FTIR光谱仪的数据,以用于研究应用。我们最大的障碍是从光谱仪的专有软件(MIRMAT版本1.0,与仪器捆绑在一起,并且恰好是.exe格式的旧编译的Matlab程序)中输出干涉图数据阵列,以便在我们自己的程序中使用。

MIRMAT软件提供了两种导出所需数据的方法。第一种是手动将数据保存在.txt文件中,然后可以将其手动导入到我们的程序中。不幸的是,这对我们来说不是一个可行的选择。我们需要能够在一秒钟内快速完成几次测量。

因此,我们留下了后一个选项,它涉及一个ActiveX容器,其中包含允许我们访问所需数据的方法和属性。这些可在光谱仪用户手册的第59和60页详细找到,位于:

http://assets.newport.com/webDocumentsEN/images/Oriel%20FTIR%20User%20Manual.PDF

到目前为止,我们依靠ActiveX属性RawDataBuffer和Numberpoints来获取收集所需数据数组所需的信息(见下文):

来自Newport光谱仪用户手册第60页

long RawDataBuffer : 指向包含干涉图数据阵列的双精度数组内存中地址的指针。 (伏)

long NumberPoints : 干涉图阵列中的数据点数

给定内存指针和数据点数作为输入,我们尝试编写以下MATLAB可执行(MEX)函数来检索我们想要的数据。该函数是用C ++编写的,由MATLAB的MEX特性编译。

 /*=================================================================
   *      pass mem adress like this
   *      ptrArg = uint64(hex2dec( '00C2E4E8' ));
   *      myMexFile( ptrArg );
   *
   *      Execute Function like this:
   *      readArray2(uint64(g),n)
   *
   *      Where:
   *      g = RawDataBuffer value
   *      n = NumberPoints value
   *=================================================================*/
  #include "mex.h"


  void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray 
  *prhs[]) 
  {
      double  *pointer;          /* pointer to real data in new array */
      mwSize index;
      double *size;


      /* Check for proper number of arguments. */
      if (nrhs != 2) 
   { 
      mexErrMsgIdAndTxt( "MATLAB:yprime:invalidNumInputs","Two input 
      arguments required.");
  }
      size = mxGetPr(prhs[1]);
      uint64_T mlData = *static_cast<unsigned long long *>( mxGetData( 
      prhs[0] ) );

      double *p = reinterpret_cast<double *>( mlData );

      /* Create an m-by-n mxArray; you will copy existing data into it */
      plhs[0] = mxCreateNumericMatrix(1, *size, mxDOUBLE_CLASS, mxREAL);
      pointer = mxGetPr(plhs[0]);

      /* Copy data into the mxArray */
      for ( index = 0; index < *size; index++ )
      {
          pointer[index] = p[index];
      }
      return;
  }

不幸的是,这个函数不会返回我们需要的数据。它当前返回一个数组,其中所有数据点都为零。当我们从ActiveX包含内存位置时,我们将其转换为并确保Matlab将其保存为UINT64。简而言之,我们很难过。如果我们的代码可以修复/改进,或者任何人对如何排除故障或解决此问题有任何建议,我们将不胜感激。

0 个答案:

没有答案