在Matlab的mex函数中使用预分配的数组

Ser*_*erg 3 matlab mex

我写了一个简单的mex函数,它已经通过Matlab数组分配了更新:

mex_test_array.c

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    double *x = mxGetPr(prhs[0]);
    x[0] = 3.1416;
}
Run Code Online (Sandbox Code Playgroud)

测试1:

>> y = zeros(2, 2);
>> mex_test_array(y);
>> y

y =

    3.1416         0
         0         0
Run Code Online (Sandbox Code Playgroud)

测试2:

>> y = zeros(2, 2);
>> mex_test_array(y(:, 1));
>> y

y =

     0     0
     0     0
Run Code Online (Sandbox Code Playgroud)

为什么它不适用于子矩阵(测试2)?它可以使它工作吗?

请指教.

备注:我明白,更新输入数组不是如何编写mex文件,我知道如何从mex返回数组.我尝试这种技术的原因是为了避免两次分配数组的内存.

Jon*_*erg 5

不应该起作用,因为MATLAB不希望改变"右侧参数".请参阅在线帮助:

prhs [是一个]指向输入数据的指针数组.输入数据是只读的,不应由mexFunction更改.

这就是你的函数头

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
Run Code Online (Sandbox Code Playgroud)

const mxArray *prhs[]而不是mxArray *prhs[].如果你想返回一个值,你应该这样做mxArray *plhs[].我认为当您更改"右侧参数"时的行为尚未定义,建议您阅读完整的MEX文件指南以获取更多详细信息.

UPDATE

为了回答你的实际问题,我假设当你y交给你的函数时,MATLAB会向你提供实际指针,并且(错误地)相信你不要惹它; 当您处理函数时,y(:,1) MATLAB会复制该部分数组并向您发送指向该副本的指针,该函数在函数调用后被丢弃.

如果您坚持这样做,至少在未记录的Matlab上阅读Matlab mex就地编辑,正如reve_etrange的评论所指出的那样!基本上,你必须运行

mxUnshareArray(const_cast<mxarray *>(prhs[0]), true); 
Run Code Online (Sandbox Code Playgroud)

在修改该数组之前.否则跑

>> y = zeros(2, 2);
>> y_backup=y;
>> mex_test_array(y);
Run Code Online (Sandbox Code Playgroud)

会导致

>> y    
y =    
    3.1416         0
             0         0
>> y_backup
y =    
    3.1416         0
             0         0
Run Code Online (Sandbox Code Playgroud)

...这使得一些难以维护的代码!

  • 但是,[未记录的内部函数](http://undocumentedmatlab.com/blog/matlab-mex-in-place-editing/)允许您在"mxArray`s"就地操作. (2认同)