一个MATLAB墨西哥函数可以接受单和双打?(Can a MATLAB Mex function a

2019-09-26 02:10发布

我有接受双矩阵作为输入一个MEX函数,但我意识到,这个函数是用于代码,可以具有单精度的矩阵为好。 是否有可能使功能能够接受?

或者,如果没有,什么是解决这个问题的另一种方式?

Answer 1:

简单的解决办法是在MATLAB中输入转换成一致的类型(大概两倍),但如果你想有你的MEX函数处理多种类型,这里是单向的。

检查与输入类型mxIsSinglemxIsDouble (或mxIsClass ),并相应地处理它。 你可能有一个if在声明中mexFunction ,设置了输入和输出,然后调用模板函数。 见下面的例子,其中在阈值使用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


文章来源: Can a MATLAB Mex function accept both single and doubles?
标签: matlab mex