2013-07-18 45 views
1

我正在创建一个模拟,我将自己移植到另一种语言。所以我不需要使用Simulink的代码生成功能。如何把它变成关闭代码的尝试?如何关闭Simulink中的代码生成? (功能不支持独立代码生成)

例如,我有内部MATLAB Function块以下代码:

function OutImage = ResizeCropPad(InImage, Width, Height) 
%#codegen 

    %coder.extrinsic('imresize'); 

    % resizing to defined height 
    scale = Height/size(InImage,1); 
    InImage = imresize(InImage, scale); 

    % cropping to defined width 
    if Width<size(InImage,2) 
     padarray(InImage, [0 size(InImage,2)-Width], 0, 'both'); 
    elseif Width>size(InImage,2) 
     b = floor((Width-size(InImage,2))/2); 
     InImage = InImage(:,b:b+Width-1,:); 
    end 

    OutImage = InImage; 

,它给出了一个错误

函数“imresize”不支持独立代码 生成。请参阅coder.extrinsic的文档以了解您如何在模拟中使用此功能 。

如果我取消coder.extrinsic('imresize')线我得到新的错误

预期的是逻辑,CHAR,INT,网络,单或双。找到一个 mxArray。 MxArrays通过调用返回到MATLAB解释器 并且在表达式中不受支持。它们只能用于作业右侧的 以及作为外部 函数的参数。

寻址线11,与if

为什么?是否有可能完全禁用代码生成,例如在模型级别?

+1

在使用MATLAB功能块,你不能把代码生成关闭的情况下。块的工作方式是将m代码转换为c代码(或者将任何代码定义为c代码中​​的code.extrinsic),然后运行编译后的代码作为模拟的一部分。它与整个模型的代码生成无关(如果您使用Simulink编码器而不是自己做)。 –

回答

1

在调用imresize函数之前,您需要取消注释coder.extrinsic('imresize');行并声明/初始化InImage变量。有关更多信息,请参阅Converting mxArrays to Known Types

在评论

编辑下面的讨论:

下面应该工作:

function OutImage = ResizeCropPad(InImage, Width, Height) 
%#codegen 

    coder.extrinsic('imresize'); 

    % resizing to defined height 
    scale = Height/size(InImage,1); 
    OutImage = InImage; 
    OutImage = imresize(InImage, scale); 

    % cropping to defined width 
    if Width<size(OutImage,2) 
     padarray(OutImage, [0 size(OutImage,2)-Width], 0, 'both'); 
    elseif Width>size(OutImage,2) 
     b = floor((Width-size(outImage,2))/2); 
     OutImage = OutImage(:,b:b+Width-1,:); 
    end 
+0

另请参阅http://www.mathworks.co.uk/matlabcentral/answers/13297-subscripting-into-an-mxarray – am304

+0

由于'InImage'是函数的输入参数,因此这不表示它已经被初始化在调用'imresize'之前? –

+0

对不起,我没有看到。在调用'imresize'时,您可能想要使用另一个变量而不是覆盖输入。为什么不直接使用'OutImage'而不是等到函数结束?在调用'imresize'函数之前,可以通过'OutImage = InImage'初始化它。 – am304