尝试使用 mex 从 Fortran 到 Matlab 的 return 数组,而不是得到空数组

Trying to return array from Fortran to Matlab with mex, getting empty array instead

所以,我正在尝试 return 一个从 1 到 n 的数字数组。

#include "fintrf.h"

C     Gateway routine
      subroutine mexFunction(nlhs, plhs, nrhs, prhs)

C     Declarations
      implicit none

C     mexFunction arguments:
      mwPointer plhs(*), prhs(*)
      integer nlhs, nrhs


      mwPointer mxGetPr
      mwPointer mxCreateDoubleMatrix
      mwPointer mxGetM, mxGetN
      mwPointer mrows, ncols
      mwSize size
      mwPointer x_ptr, y_ptr
      integer  x_input,i
      real*8, allocatable :: vec(:)
      x_ptr = mxGetPr(prhs(1))
      mrows = mxGetM(prhs(1))
      ncols = mxGetN(prhs(1))
      size = mrows*ncols

      x_ptr=mxGetPr(prhs(1))
      call mxCopyPtrToReal8(x_ptr,x_input,size)

      allocate (vec(x_input))

      do i=1,x_input
        vec(i)=i
      end do

      plhs(1) = mxCreateDoubleMatrix(1, x_input, 0)


      y_ptr = mxGetPr(plhs(1))
      call mxCopyReal8ToPtr(vec,y_ptr,x_input)



      deallocate ( vec )
      return
      end

然后我在这里用 fortran 调用 mex 文件

mex testingvec.F
Building with 'gfortran'.
MEX completed successfully.
a=testingvec(10);

然后找到

a=[]

有人可以帮我解决这个问题吗?如果有人能给我一些示例代码如何 return 一个矩阵,那就太好了。

谢谢大家。

编辑:代码的新部分。仍在尝试获得一些帮助。

#include "fintrf.h"

C     Gateway routine
      subroutine mexFunction(nlhs, plhs, nrhs, prhs)

C     Declarations
      implicit none

C     mexFunction arguments:
      mwPointer plhs(*), prhs(*)
      integer nlhs, nrhs


      mwPointer mxGetPr
      mwPointer mxCreateDoubleMatrix
      mwPointer mxGetM, mxGetN
      mwPointer mrows, ncols
      mwSize size
      mwPointer x_ptr, y_ptr
      integer  i
      mwSize sizeone, x_input 
      integer*4 izero 
      real*8, allocatable :: vec(:)
      x_ptr = mxGetPr(prhs(1))
      mrows = mxGetM(prhs(1))
      ncols = mxGetN(prhs(1))
      size = mrows*ncols
      sizeone=1 
      izero=0 

      x_ptr=mxGetPr(prhs(1))
      call mxCopyPtrToReal8(x_ptr,x_input,size)

      allocate (vec(x_input))

      do i=1,x_input
        vec(i)=i
      end do

      plhs(1) = mxCreateDoubleMatrix(sizeone,x_input,izero)



      call mxCopyReal8ToPtr(vec,mxGetPr(plhs(1)),x_input)



      deallocate ( vec )
      return
      end

存在声明问题和调用 mex 函数的问题。这是一个解决方案,它假设输入是一个整数值的双精度值,为您提供输出向量的长度(假设这就是您想要的)。

#include "fintrf.h"

C     Gateway routine
      subroutine mexFunction(nlhs, plhs, nrhs, prhs)

C     Declarations
      implicit none

C     mexFunction arguments:
      mwPointer plhs(*), prhs(*)
      integer*4 nlhs, nrhs


      mwPointer mxGetPr
      mwPointer mxCreateDoubleMatrix
      mwSize mxGetM, mxGetN
      mwSignedIndex mrows, ncols
      mwSize size, x_input, sizeone
      mwPointer x_ptr, y_ptr
      integer*4  i, izero, x_int
      real*8, allocatable :: vec(:)
      real*8 :: x_dbl

      sizeone = 1
      izero = 0



      !check input/output syntax
      if (nrhs /= 1) then
        call mexErrMsgIdAndTxt("MATLAB:testingvec:rhs",
    >            "Exactly 1 input variable required.")
      end if
      if (nlhs /= 1) then
        call mexErrMsgIdAndTxt("MATLAB:testingvec:lhs",
 >            "Exactly 1 output matrix required.")
      end if


      x_ptr = mxGetPr(prhs(1))
      mrows = mxGetM(prhs(1))
      ncols = mxGetN(prhs(1))
      size = mrows*ncols

      call mxCopyPtrToReal8(x_ptr,x_dbl,sizeone)
      x_input = int(x_dbl)

      allocate (vec(x_input))

      do i=1,x_input
        vec(i)=i
      end do

      plhs(1) = mxCreateDoubleMatrix(sizeone, x_input, izero)

      y_ptr = mxGetPr(plhs(1))
      call mxCopyReal8ToPtr(vec,y_ptr,x_input)



      deallocate ( vec )
      return
      end

我引入了检查input/output个变量的数量(在实际程序中更新)。我引入了一个可能需要也可能不需要的辅助 x_dbl 。此版本读取提供给函数的 double 输入,并将其截断以获得 x_input.