将整数类型传递给mex函数

时间:2014-08-06 18:45:55

标签: c++ matlab int mex

我目前正在使用mex函数,其中整数作为参数发送,首先将其转换为int类型:

a = int32(10);
foo(a);

foo通过使用:

接收/检查a
void get_integer_scalar(int &scalar,const mxArray *mat_buf) {
    // Check input
    if (mxIsClass(mat_buf,"int32")) {
        if (mxGetN(mat_buf) == 1 &&  mxGetM(mat_buf) == 1) {
            // At this point, input is correct
            scalar = *((int *)mxGetData(mat_buf));
        } else {
            mexErrMsgTxt("Integer scalar is not of size == [1 1].\n");
        }
    } else {
        mexErrMsgTxt("Integer scalar is not int32.\n");
    }
}

现在,我突然意识到int类型与机器有关,因此行scalar = *((int *)mxGetData(mat_buf));可能不安全(或者是它?我试图不做假设关于int32()如何在matlab中工作)。有没有一种安全的方法可以将标准int类型传递给mex文件,还是应该使用像int32_t这样的32位整数类型?

1 个答案:

答案 0 :(得分:4)

使用mxGetScalar,无论输入类型是什么,都会返回一个double值,无需担心。

double mxGetScalar(const mxArray *pm); // the type of data in pm doesn't matter
  

在C中,mxGetScalar返回一个双精度数。如果mxArray中的真实元素属于double以外的类型, mxGetScalar会自动将标量值转换为double 。要保留标量的原始数据表示形式,请将返回值强制转换为所需的数据类型。

只需检查元素数量,您甚至不需要进行类型检查(但如果需要,我会使用mxIsInt32):

#include <mex.h>

void get_integer_scalar(int &scalar,const mxArray *mat_buf) {
    // Check input
    if (!mxIsInt32(mat_buf))
        mexPrintf("Integer scalar is not int32, but that's OK.\n");

    if (mxGetNumberOfElements(mat_buf) == 1) {
        scalar = mxGetScalar(mat_buf);
    } else {
        mexErrMsgTxt("Integer scalar is not of size == [1 1].\n");
    }
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    int val;
    if (nrhs>0)
    {
        get_integer_scalar(val,prhs[0]); // type of prhs[0] does not matter
        mexPrintf("%d\n",val);
    }
}

要回答你的问题,MATLAB的int32显然不依赖于机器,但正如你所指出的那样,不能保证C ++ int将是32位的。我认为mxGetScalar解决了这个问题,但是对于数组(当你需要安全地投射指针时)我认为你可以使用<stdint.h><cstdint>来设置{{1 }},int8_tint16_tint32_t等.Visual Studio会int64_t

MATLAB还有一个标题用于此目的:typedef int int32_t;。它设置以下固定宽度类型:

tmwtypes.h

以下是/*=======================================================================* * Fixed width word size data types: * * int8_T, int16_T, int32_T - signed 8, 16, or 32 bit integers * * uint8_T, uint16_T, uint32_T - unsigned 8, 16, or 32 bit integers * * real32_T, real64_T - 32 and 64 bit floating point numbers * *=======================================================================*/ 的相关内容:

int32_T

通过将#ifndef INT32_T # if TMW_BITS_PER_INT == 32 # define INT32_T int # elif TMW_BITS_PER_LONG == 32 # define INT32_T long # elif TMW_BITS_PER_SCHAR == 32 # define INT32_T signed char # elif TMW_BITS_PER_SHRT == 32 # define INT32_T short # endif #endif #ifdef INT32_T typedef INT32_T int32_T; #endif 与各种十六进制文字进行比较,标题中的TMW_BITS_PER_INT得到INT_MAX0x7FFFFFFFL胜出。 基本上,如果您要int32_T,则可以tmwtypes.h中所述使用int

但是,我怀疑MATLAB支持使用除{{1}}的32位无符号整数之外的任何工具集。