gpt4 book ai didi

c++ - 将整数类型传递给 mex 函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:03:49 24 4
gpt4 key购买 nike

我目前正在使用 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 位 int 类型?

最佳答案

使用 mxGetScalar ,它返回一个 double 值,无论输入类型是什么,您都可以放心地转换它。

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

In C, mxGetScalar returns a double. If real elements in the mxArray are of a type other than double, mxGetScalar automatically converts the scalar value into a double. To preserve the original data representation of the scalar, cast the return value to the desired data type.

只需检查元素的数量,甚至不需要类型检查(但如果需要,我会使用 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> , 设置int8_t , int16_t , int32_t , int64_t等。Visual Studio 会执行 typedef int int32_t; .

MATLAB 也有一个用于此目的的标题: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_MAX 在标题的前面带有各种十六进制文字,以及 0x7FFFFFFFL胜出。 基本上,您可以使用 int32_T ,如 the docs for mxClassID 中所述, 如果你包括 tmwtypes.h .

但是,我怀疑 MATLAB 是否支持使用 32 位无符号整数以外的任何工具集来表示 int。 .

关于c++ - 将整数类型传递给 mex 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25167867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com