我想问如何在不复制的情况下从 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
复制了该变量。
附加信息:
感谢您的关注!
@CrisLuengo 在评论中回答了这个问题,所以我只是在这里回复那些发现自己处于同样情况的人。
解决方案是使用
mxGetScalar
,它正是我想要的(或者 mxGetDoubles
如果你想检索超过 1 个值)。
语法如下:首先声明辅助函数和你想要的输入变量
real*8 mxGetScalar real*8 :: x
最后你使用这个函数:
x = mxGetScalar(prhs(1))
其中
(1)
指的是您在 MATLAB 上调用函数时输入参数的位置。
我知道这现在有点明显,但文档没有明确的示例让我了解如何使用它。我希望这有帮助!