我写了一个简单的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返回数组。 我尝试这种技术的原因是为了避免两次分配数组的内存。
答案 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
......这使得一些地狱无法维护的代码!