gpt4 book ai didi

matlab - Mex 文件 : how to return an already allocated matlab array

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:54 27 4
gpt4 key购买 nike

我发现了一个非常棘手的问题,我似乎无法轻易解决。简而言之,我想从 mex 文件返回一个数组,该数组已作为 mex 函数输入传递。你可以简单地这样做:

void mexFunction(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[])
{
pargout[0] = pargin[0];
}

但这不是我需要的。我想从 pargin[0] 获取原始指针,在内部处理它,并通过设置相应的数据指针返回一个新创建的 mex 数组。像那样:

#include <mex.h>

void mexFunction(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[])
{
mxArray *outp;
double *data;
int m, n;

/* get input array */
data = mxGetData(pargin[0]);
m = mxGetM(pargin[0]);
n = mxGetN(pargin[0]);

/* copy pointer to output array */
outp = mxCreateNumericMatrix(0,0,mxDOUBLE_CLASS,mxREAL);
mxSetM(outp, m);
mxSetN(outp, n);
mxSetData(outp, data);
/* segfaults with or without the below line */
mexMakeMemoryPersistent(data);
pargout[0] = outp;
}

这是行不通的。我得到一个段错误,如果不是立即,然后在几个电话之后。我相信关于这种情况没有任何说法in the documentation .唯一的要求是 data 指针已使用 mxCalloc 进行分配,这显然是有的。因此,我认为此代码是合法的。

我需要这样做,因为我正在将一个复杂的 MATLAB 结构解析为我的内部 C 数据结构。我处理数据,一些数据被重新分配,一些没有。我想透明地返回输出结构,而不考虑何时必须简单地复制 mxArray(第一个代码片段),以及何时必须创建它。

请帮忙!

编辑

在进一步查看和与 Amro 讨论后,似乎即使是我的第一个代码片段也不受支持,并且在某些情况下可能导致 MATLAB 崩溃,例如,当将结构字段或单元格元素传递给这样的 mex 函数时:

>> a.field = [1 2 3];
>> b = pargin_to_pargout(a.field); % ok - works and assigns [1 2 3] to b
>> pargin_to_pargout(a.field); % bad - segfault

看来我将不得不走“未记录的 MATLAB”之路并使用 mxCreateSharedDataCopymxUnshareArray

最佳答案

你应该使用 mxDuplicateArray ,这是记录的方式:

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
plhs[0] = mxDuplicateArray(prhs[0]);
}

关于matlab - Mex 文件 : how to return an already allocated matlab array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19813718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com