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

时间:2012-03-23 19:06:36

标签: 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;
}

测试1:

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

y =

    3.1416         0
         0         0

测试2:

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

y =

     0     0
     0     0

为什么它不适用于子矩阵(测试2)?是否有可能使其有效?

请告知。

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

1 个答案:

答案 0 :(得分:5)

不应有效,因为 MATLAB不希望“右侧参数”改变。请参阅示例the online help

  

prhs [是]输入数据的指针数组。输入数据是只读的   不应该被你的mexFunction改变。

这就是你的函数头

的原因
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

const mxArray *prhs[]而非mxArray *prhs[]。如果您想返回一个值,那么应该通过mxArray *plhs[]执行此操作。我认为当您更改“右侧参数”时的行为尚未定义,建议您阅读完整的MEX files guide以获取更多详细信息。

<强>更新

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

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

mxUnshareArray(const_cast<mxarray *>(prhs[0]), true); 
在修改该数组之前

。否则运行

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

将导致

>> y    
y =    
    3.1416         0
             0         0
>> y_backup
y =    
    3.1416         0
             0         0

......这使得一些地狱无法维护的代码!