在MATLAB编码器中使用带有阶跃函数的MX阵列的问题
我正在尝试使用MATLAB编码器将我在MATLAB上的图像处理代码转换成C。使用在MATLAB编码器中使用带有阶跃函数的MX阵列的问题,matlab,image-processing,matlab-coder,Matlab,Image Processing,Matlab Coder,我正在尝试使用MATLAB编码器将我在MATLAB上的图像处理代码转换成C。使用imread需要coder.entrisic声明。但是,这意味着imread的输出将是一个mxArray。这是一个问题,因为我无法将其用于步骤功能。代码生成的错误报告如下所示: 有人知道解决方法吗?使用coder.extrinsic时,声明为extrinsic的函数将返回mxArray类型。如果您将这些函数传递给其他Matlab函数,编码器将很好地解决所有问题,但如果您将它们与自己的函数一起使用,或者以任何方式尝试
imread
需要coder.entrisic
声明。但是,这意味着imread的输出将是一个mxArray。这是一个问题,因为我无法将其用于步骤
功能。代码生成的错误报告如下所示:
有人知道解决方法吗?使用coder.extrinsic时,声明为extrinsic的函数将返回mxArray类型。如果您将这些函数传递给其他Matlab函数,编码器将很好地解决所有问题,但如果您将它们与自己的函数一起使用,或者以任何方式尝试操纵它们,则需要帮助编码器将它们解析为已知类型。您可以通过预先定义一个变量并将mxArray复制到其中来实现这一点,这将允许编码器正确地转换为标准数据类型。如果您事先知道确切的大小,可以在调用之前预先分配变量并跳过副本,但在这种情况下可能会有点棘手 对于您的函数,我假设您在某个地方有一个调用,如下所示:
I = imread([some paramaters]);
我们需要从imread调用中获取mxArray类型,然后确定其维度,以便在本机类型中分配另一个变量。使用size
函数本身确定mxArray维度需要有一个预分配的变量,以便size
也不会返回mxArray。以下是步骤:
coder.extrinsic('imread');
Itemp = imread([some paramaters]);
idims = zeros(1,3); %Need to preallocate idims so it does not become an mxArray
idims = size(Itemp)
I = coder.nullcopy(zeros(idims, 'uint8')); % Allocate but do not initialize an array of uint8 values of the same size as Itemp
I = Itemp; % Copy the data from the mxArray into the final variable.
如果在调用imread之前知道图像的确切大小,则可以跳过副本和第二个变量,只需将变量I预分配到正确的大小,但这通常不是图像读取的情况
您可以在Mathworks的以下帮助文档中看到有关如何执行此操作的更多信息:
我很高兴这有帮助。不幸的是,MATLAB文档在这个主题上没有太大帮助。此外,对于可变尺寸,需要稍微摆弄一下才能将所有内容转换。也许有一种方法可以在没有额外副本的情况下做到这一点,但我想不出来。