在 MATLAB Coder 中将 mxarrays 与 step 函数一起使用的问题
Posted
技术标签:
【中文标题】在 MATLAB Coder 中将 mxarrays 与 step 函数一起使用的问题【英文标题】:Problems with using mxarrays with the step function in MATLAB Coder 【发布时间】:2015-04-18 19:29:07 【问题描述】:我正在尝试使用 MATLAB 编码器将我在 MATLAB 上的图像处理代码转换为 C。使用 imread
需要 coder.entrinsic
声明。然而,这意味着 imread 的输出将是一个 mxArray。这是一个问题,因为我不能将它与 step
函数一起使用。代码生成的错误报告如下所示:
有人知道解决这个问题的方法吗?
【问题讨论】:
【参考方案1】:使用 coder.extrinsic 时,声明为 extrinsic 的函数将返回 mxArray 类型。如果您将这些传递给其他 Matlab 函数,Coder 将很好地解决所有问题,但如果您将它们与您自己的函数一起使用或以任何方式尝试操作它们,您需要帮助 Coder 将它们解析为已知类型。为此,您可以预先定义一个变量并将 mxArray 复制到其中,这将允许 Coder 正确转换为标准数据类型。如果您事先知道确切的大小,您可以在调用之前预先分配变量并跳过复制,但在这种情况下可能会有点棘手。
就您的函数而言,我假设您在某处进行了如下调用:
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 的以下帮助文档中查看有关如何执行此操作的更多信息:
http://www.mathworks.com/help/simulink/ug/calling-matlab-functions.html#bq1h2z9-47
【讨论】:
我很高兴有帮助。不幸的是,MATLAB 文档在这个主题上不是很有帮助。此外,由于尺寸可变,需要花点时间才能转换所有内容。可能有一种方法可以在没有额外副本的情况下做到这一点,但我想不通。以上是关于在 MATLAB Coder 中将 mxarrays 与 step 函数一起使用的问题的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码
我应该如何将数据传递给 mexFunction 的 mxArray *plhs[] 以便在 Matlab 中获得其输出?