如何使用 MEX 从 MATLAB 访问 Fortran 上的变量(无需复制它们)?

问题描述 投票:0回答:1

我想问如何在不复制的情况下从 MATLAB 访问 Fortran 上的变量。最好,我想访问 Fortran 上的变量(可能是“只读”),该变量在 MATLAB 上声明和初始化,并作为输入传递给我的基于 Fortran 的 MEX 函数作为输入(几乎是一个传递)通过引用),如果可能的话,对多维数组执行此操作。

到目前为止我找到的解决方案需要复制变量,这对于大量输入来说成本相当高。

到目前为止,我已经尝试了基于 MATLAB 文档中给出的解决方案的方法,其中他们实现了

y = times2(x)
形式的函数,该函数将我的双标量
x
加倍。但是,它需要复制变量
x
,因此在 MATLAB 上声明了原始的
x
,在 Fortran 上声明了另一个。

作为参考,MATLAB 建议首先声明一个指针及其关联变量

mwPointer x_ptr real*8 x_input

然后通过以下方式将 MATLAB 变量

x
的内容复制到 Fortran 变量
x_input
中:

call mxCopyPtrToReal8(x_ptr,x_input,size)

其中

size
为 1,因为
x
是标量,但在我的应用程序中我最终将使用多维数组。

当需要对大型数组进行操作时,此解决方案没有吸引力,因为它们会被复制,从而使我的内存需求增加一倍。我发现 this 函数

mexGetVariablePtr
它返回一个只读 MATLAB 指针,理论上应该可以让我访问变量
x
而无需复制它。

我的问题是:如何访问这个变量,因为我在 API 文档中找到的唯一函数

mxCopyPtrToReal
复制了该变量。

附加信息:

  • 我只想读取变量“x”的内容并用作普通的 Fortran 变量而不对其进行修改。
  • “mexGetVariablePtr”的输出是“mwPointer”,它似乎不像常规 Fortran 指针那样容易取消引用。

感谢您的关注!

matlab fortran mex
1个回答
0
投票

@CrisLuengo 在评论中回答了这个问题,所以我只是在这里回复那些发现自己处于同样情况的人。

解决方案是使用

mxGetScalar
,它正是我想要的(或者
mxGetDoubles
如果你想检索超过 1 个值)。

语法如下:首先声明辅助函数和你想要的输入变量

real*8  mxGetScalar real*8 :: x

最后你使用这个函数:

x = mxGetScalar(prhs(1))

其中

(1)
指的是您在 MATLAB 上调用函数时输入参数的位置。

我知道这现在有点明显,但文档没有明确的示例让我了解如何使用它。我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.