能否在mex代码中使用matlab表格?

3
我希望能在mex代码中操作matlab表格(http://se.mathworks.com/help/matlab/tables.html)。这是否可能?
例如,若要在mex代码中操作数组,则可以调用以下函数:
mxArray * matlabArray = prhs[0] ;// if matlabArray was the first argument to the mex function;

有没有办法做类似这样的事情

mxTable * matlabTable  = prhs[0] ; //mxTable does not actually exist... but I would like it to:)

并将表格作为第一个参数传递?


如果你执行 mxArray * matlabArray = prhs[0],而 prhs[0] 是一个表格,会发生什么?它会抛出错误还是可以查看值? - kkuilla
什么都没有发生。在VC++调试器中,您可以检查matlabArray(例如作为浮点数),但它与我传递的内容不同。您还可以获取底层数据(通过mxGetPr(matlabArray))并将其分配给一个双精度向量,然后移动到该向量(idx ++)中,但是在前几个字节中有0(被视为64位双精度)……我的意思是prhs [0]只是一个指针,那么为什么还会引发错误?我传递了这个表格:“table([-1,3.14,2.78]’,categorical({'a','b','c'}))”。 - alexandre iolov
2
你想对表格做什么?你可能需要使用mexCallMATLAB调用MATLAB函数,并将表格mxArray作为输入传递给MATLAB进行处理。 - Navan
@Navan,感谢您提醒我mexCallMATLAB。问题的重点是要找出mex库是否提供任何C功能来操作表格,例如innerjoins、聚合或其他您可能想要使用表格进行的操作。我没有具体的用例... - alexandre iolov
我认为没有针对特定表的mex库函数。 - Navan
3个回答

2

prhs是一个mxArray指针数组,所以你的第一行代码是正确的。

使用mxIsClass (https://www.mathworks.com/help/matlab/apiref/mxisclass.html)来确定输入数组是否为类型table:

if (mxIsClass(prhs[0],"table") { ... }

要访问表格的属性,请使用mxGetProperty函数(https://www.mathworks.com/help/matlab/apiref/mxgetproperty.html):

mxArray* data = mxGetProperty(prhs[0],0,"ColumnName");

这相当于MATLAB命令table.ColumnName。然后data应该是一个普通的双精度矩阵。不幸的是,这种语法会创建数据的副本。没有记录的方法可以在(非标准)对象内部访问数据而不进行复制。关于未记录的方法,请参见:http://www.advanpix.com/2013/07/19/undocumented-mex-api/


1

目前无法在基于以下内容的mex函数中访问Matlab表:

  1. 您可以在Matlab C/C++,Fortran和Python API参考文献中进行tableCtrl+F搜索,只能找到对表的引用。我认为这证明没有提供mxTable类型。

  2. Matlab中的table类型是作为Matlab类实现的。您可以通过在命令窗口中键入edit table来查看表的所有源代码。数字数组或单元数组不具备这种功能。

这似乎不是Mex支持中的遗漏,因为表格的主要优势在于它们很好地组织数据。如果您有计算要求需要编写Mex函数,则可能已经在Matlab中使用数字数组。


0
这里有一个解决办法来绕过MATLAB表格访问的限制,可以使用MATLAB特定的函数来提取所需的数据,就像这样:
function res = extract_table_data(tbl, column)
    res = tbl.(column);
end

在C mex代码中,您可以像这样定义tbl_get_column
static mxArray* tbl_get_column(const mxArray* tbl, const char* column_name)
{
    mxArray* column_arg = mxCreateString(column_name);

    mxArray* args[] = { (mxArray*)tbl,  column_arg };
    mxArray* result = 0;

    mexCallMATLAB(1, &result, 2, args, "extract_table_data");

    mxDestroyArray(column_arg);

    return result;
}

在你的 mexFunction 中,你可以按照以下方式访问数据:
    mxArray* time_arr = tbl_get_column(prhs[0], "Time");

使用MATLAB R2021b进行测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接