我有一个接受双矩阵作为输入的mex函数,但我只是意识到这个函数用于代码,也可以有单精度矩阵。是否有可能允许函数接受?MATLAB Mex函数可以接受单个和双重吗?
如果不是,那么解决此问题的另一种方法是什么?
我有一个接受双矩阵作为输入的mex函数,但我只是意识到这个函数用于代码,也可以有单精度矩阵。是否有可能允许函数接受?MATLAB Mex函数可以接受单个和双重吗?
如果不是,那么解决此问题的另一种方法是什么?
简单的解决方案是将MATLAB中的输入转换为一致的类型(假设是双精度型),但是如果您希望让MEX函数处理多种类型,这里有一种方法。
检查输入类型为mxIsSingle
和mxIsDouble
(或mxIsClass
)并相应地处理它。您可能在mexFunction
中有if
语句,它们设置输入和输出,然后调用模板函数。请参阅下面的示例,该阈值使用C++标准库函数模板std::min<T>
阈值数组中的所有值,而不需要任何数据转换。
flexibleFunction.cpp
#include "mex.h"
#include <algorithm> // std::min
template <typename T>
void threshArrayLT(T *out, const T *arr, mwSize n, T c)
{ // you allocate out
for (mwSize i = 0; i < n; ++i)
out[i] = std::min<T>(arr[i], c);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nlhs > 1 || nrhs != 2)
mexErrMsgTxt("Syntax:\n\tH = flexibleFunction(arr,c)");
if (!mxIsDouble(prhs[0]) && !mxIsSingle(prhs[0]))
mexErrMsgTxt("Array must be double or single.");
if ((mxIsDouble(prhs[0]) && !mxIsDouble(prhs[1])) ||
(mxIsSingle(prhs[0]) && !mxIsSingle(prhs[1])))
mexErrMsgTxt("Arguments must have same type.");
const mwSize* dims = mxGetDimensions(prhs[0]);
int ndims = static_cast<int>(mxGetNumberOfDimensions(prhs[0]));
size_t numel = mxGetNumberOfElements(prhs[0]);
if (mxIsDouble(prhs[0])) {
double *arr = mxGetPr(prhs[0]);
double c = mxGetScalar(prhs[1]);
plhs[0] = mxCreateNumericArray(ndims,dims,mxDOUBLE_CLASS,mxREAL);
threshArrayLT(mxGetPr(plhs[0]),arr,numel,c);
// In reality, if it's this simple, use std::transform with lambda or bind:
//std::transform(arr, arr+numel, mxGetPr(plhs[0]),
// [&](double s){ return std::min(s,c); });
} else if (mxIsSingle(prhs[0])) {
float *arr = (float*)mxGetData(prhs[0]);
float c = static_cast<float>(mxGetScalar(prhs[1]));
plhs[0] = mxCreateNumericArray(ndims,dims,mxSINGLE_CLASS,mxREAL);
threshArrayLT((float*)mxGetData(plhs[0]),arr,numel,c);
}
}
您也可以使用C++(名称相同,不同的参数类型)函数重载。
例
>> v = rand(1,8); c = 0.5;
>> whos v c
Name Size Bytes Class Attributes
c 1x1 8 double
v 1x8 64 double
>> flexibleFunction(v,c)
ans =
0.2760 0.5000 0.5000 0.1626 0.1190 0.4984 0.5000 0.3404
>> flexibleFunction(single(v),single(c))
ans =
0.2760 0.5000 0.5000 0.1626 0.1190 0.4984 0.5000 0.3404
但是如果我正在使用MATLAB的编码器工具包直接从matlab代码创建mex文件会怎么样。构建器要求我定义一个输入类型,然后才能将其转换为mex。有没有办法做你所描述的,但与编码器工具包?消除中间的C++部分。 – 2014-10-06 18:21:08
@GBoggs我对编码器不是很熟悉,但它听起来好像无法处理它。在你的问题中,你没有提到编码器,所以我认为你正在编写MEX功能。我不会破解编码器输出源。 – chappjc 2014-10-06 18:33:16
转换的输入端,具有不同的代码路径在MEX,和/或试图使用C++模板。你能提供更多细节吗? – chappjc 2014-10-06 16:39:20
@chappjc它就像听起来一样,我有一个mex函数,它应该采取单个或双重,但我不知道如何让它接受两个。例如,截至目前它只接受双打作为输入,这意味着如果我尝试输入一个单精度矩阵,它将会出错。 – 2014-10-06 17:09:00