c++ - mex中const size_t的转换

标签 c++ matlab int

我尝试使用来自 http://yaafe.sourceforge.net/manual/install.html 的 yaafe 库.一切都已安装并且工作正常。但是我想使用 matlab 接口(interface),我尝试使用以下命令编译提供的 yaafemex.cpp mex yaafemex.cpp 但我在 Matlab 上遇到此错误

Building with 'Xcode Clang++'.
Error using mex
/Users/TMAC/Documents/MATLAB/Add-Ons/Collections/Yaafe/yaafemex.cpp:107:22: error: no matching function for call
to 'mxCreateNumericArray_730'
        mxArray* featdata = mxCreateNumericArray(2,dims,mxDOUBLE_CLASS,mxREAL);
                            ^~~~~~~~~~~~~~~~~~~~
/Applications/MATLAB_R2017a.app/extern/include/matrix.h:1111:30: note: expanded from macro 'mxCreateNumericArray'
#define mxCreateNumericArray mxCreateNumericArray_730
                             ^~~~~~~~~~~~~~~~~~~~~~~~
/Applications/MATLAB_R2017a.app/extern/include/matrix.h:782:1: note: candidate function not viable: no known conversion
from 'int [2]' to 'const size_t *' (aka 'const unsigned long *') for 2nd argument
mxCreateNumericArray_730(size_t ndim, const size_t *dims, mxClassID classid, mxComplexity flag);
^
1 error generated.

部分代码(我没有更改yaafe库提供的初始代码)

yaafemex.cpp

/* write data */
int dims[2] = {buf->info().size , buf->availableTokens()};
mxArray* featdata = mxCreateNumericArray(2,dims,mxDOUBLE_CLASS,mxREAL); //line 107
double* featdataPtr = (double*) mxGetData(featdata);
buf->read(featdataPtr,buf->availableTokens());
buf->consumeTokens(buf->availableTokens());
mxSetField(feat,0,"data",featdata);

矩阵.h

/*
 * Create a numeric array and initialize all its data elements to 0.
 *
 * Similar to mxCreateNumericMatrix, in a standalone application,
 * out-of-memory will mean a NULL pointer is returned.
 */
LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *
mxCreateNumericArray_730(size_t ndim, const size_t *dims, mxClassID classid, mxComplexity flag); //line 782
LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *
mxCreateNumericArray_700(int ndim, const int *dims, mxClassID classid, mxComplexity flag);

最佳答案

int dims[2] = {buf->info().size , buf->availableTokens()};

是有符号的,mxCreateNumericArray 需要 const size_t *,这是一个无符号的数字类型。您需要显式转换 dims 或使用适当的类型定义 dims。

具体来说,我将在 yaafe 中编辑 dims 的定义如下:

size_t dims[2] = {static_cast<size_t>(buf->info().size) , static_cast<size_t>(buf->availableTokens())};

关于c++ - mex中const size_t的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073876/

相关文章:

matlab - 删除重复项 - ** 仅当重复项按顺序出现时

java - 为什么 UVa 在线判断 100 (3n+1) 的方法 A 与 B 相比有缺陷?

c++ - 如何比较两个函数的签名?

c++ - 结构体中的函数指针

MATLAB:在曲面图上绘图

使用 CUDA 的 matlab if 语句

function - Lisp 中的 x++ 等价物?

c++ - C++将数字和逗号的char数组转换为整数列表?

c++ - boost lambda 问题

C++ 最佳实践 - 函数类型别名 std::function<T> 或 T