在 MATLAB Coder 中将 mxarrays 与阶跃函数一起使用时出现的问题
Problems with using mxarrays with the step function in MATLAB Coder
我正在尝试使用 MATLAB 编码器将我在 MATLAB 上的图像处理代码转换为 C。使用 imread
需要 coder.entrinsic
声明。然而,这意味着 imread 的输出将是一个 mxArray。这是一个问题,因为我不能将它与 step
函数一起使用。代码生成的错误报告如下所示:
有人知道解决这个问题的方法吗?
使用 coder.extrinsic 时,声明为外部函数的函数将 return mxArray 类型。如果您将这些传递给其他 Matlab 函数,Coder 将很好地解析所有内容,但如果您将它们与您自己的函数一起使用或以任何方式尝试操纵它们,您需要帮助 Coder 将它们解析为已知类型。您可以通过预定义变量并将 mxArray 复制到其中来执行此操作,这将允许 Coder 正确地转换为标准数据类型。如果事先知道确切的大小,则可以在调用之前预分配变量并跳过复制,但在这种情况下可能会有点棘手。
就您的函数而言,我假设您在某处有一个调用,如下所示:
I = imread([some paramaters]);
我们需要从对 imread 的调用中获取 mxArray 类型,然后确定其维度,以便可以在本机类型中分配另一个变量。使用 size
函数本身确定 mxArray 维度需要有一个预分配的变量,这样 size
就不会 return 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 上的图像处理代码转换为 C。使用 imread
需要 coder.entrinsic
声明。然而,这意味着 imread 的输出将是一个 mxArray。这是一个问题,因为我不能将它与 step
函数一起使用。代码生成的错误报告如下所示:
有人知道解决这个问题的方法吗?
使用 coder.extrinsic 时,声明为外部函数的函数将 return mxArray 类型。如果您将这些传递给其他 Matlab 函数,Coder 将很好地解析所有内容,但如果您将它们与您自己的函数一起使用或以任何方式尝试操纵它们,您需要帮助 Coder 将它们解析为已知类型。您可以通过预定义变量并将 mxArray 复制到其中来执行此操作,这将允许 Coder 正确地转换为标准数据类型。如果事先知道确切的大小,则可以在调用之前预分配变量并跳过复制,但在这种情况下可能会有点棘手。
就您的函数而言,我假设您在某处有一个调用,如下所示:
I = imread([some paramaters]);
我们需要从对 imread 的调用中获取 mxArray 类型,然后确定其维度,以便可以在本机类型中分配另一个变量。使用 size
函数本身确定 mxArray 维度需要有一个预分配的变量,这样 size
就不会 return 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