我写了一个简单的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返回数组.我尝试这种技术的原因是为了避免两次分配数组的内存.
这不应该起作用,因为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)
...这使得一些难以维护的代码!