可以在墨西哥代码中使用matlab表格吗?

kb5ga3dv  于 8个月前  发布在  Matlab
关注(0)|答案(3)|浏览(110)

我想操纵一个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:)

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

jhkqcmku

jhkqcmku1#

prhs是一个mxArray指针数组,所以第一行代码是正确的。
使用mxIsClasshttps://www.mathworks.com/help/matlab/apiref/mxisclass.html)判断输入数组是否为table类型:

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

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

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

这相当于MATLAB命令table.ColumnNamedata应该是一个正规的二重矩阵。不幸的是,这种语法创建了数据的副本。没有记录的方法可以访问(非标准)对象内部的数据而不进行复制。有关未记录的方式,请参见:http://www.advanpix.com/2013/07/19/undocumented-mex-api/

w9apscun

w9apscun2#

目前无法在基于以下内容的mex函数中访问Matlab表:
1.您可以在Matlab C/C++、Fortran和Python API Reference for table上执行Ctrl+F,并仅引用文本中的表。我认为这是没有提供mxTable类型的证据。

  1. Matlab中的table类型是作为Matlab类实现的。实际上,您只需在命令窗口中键入edit table,就可以看到表的所有源代码。对于数值数组或单元格数组,则不是这样。
    这似乎并不是mex支持的一个遗漏,因为主要的advantage of tables是他们组织数据很好。如果你有计算需求,这会促使你编写一个mex函数,你可能已经在Matlab中使用数值数组了。
w6lpcovy

w6lpcovy3#

这里有一个解决方案,可以通过使用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进行测试

相关问题