coder.noImplicitExpansionInFunction

Отключите неявное расширение в заданной функции в сгенерированном коде

    Описание

    пример

    coder.noImplicitExpansionInFunction отключает неявное расширение в коде, сгенерированном для MATLAB® функция, в которой это называется.

    Отключите неявное расширение, чтобы применить бинарные операции, и функции в сгенерированном коде без автоматического размера превращаются в операнды, генерацию дополнительного кода и изменения эффективности. Смотрите Генерируют Код С Enabled Неявным расширением, Оптимизируют Неявное расширение в Сгенерированном коде и Совместимых Размерах Массивов для Основных Операций.

    coder.noImplicitExpansionInFunction только влияет на бинарные операции в сгенерированном коде. Эта функция не отключает неявное расширение в коде MATLAB. Чтобы применить определенные бинарные операции и функции в MATLAB без неявного расширения, использовать coder.sameSizeBinaryOp.

    Примеры

    свернуть все

    Используйте coder.noImplicitExpansionInFunction отключить неявное расширение в коде, сгенерированном для функции MATLAB путем призыва его в необходимой функции. Отключите неявное расширение, чтобы применить бинарные операции и функции без:

    • Автоматическое изменение размера совместимых операндов размера

    • Генерация дополнительного кода

    • Изменения эффективности

    В этом примере, функции DisableImpExpinFunction и ImpExpinFunction добавьте два операнда совместимых размеров с идентичным кодом, но первый отключает неявное расширение. Код сгенерирован для DisableImpExpinFunction не содержит дополнительный код, чтобы применить неявное расширение. Код сгенерирован для ImpExpinFunction содержит циклы, которые должны быть выполнены, если операнды имеют совместимый размер и могут быть неявно расширены во времени выполнения.

    В генерации кода сообщают для двух функций, размеров выражения, присваивающего out значения отличаются.

    Задайте функциональный DisableImpExpinFunction это вычисляет сложение двух операндов без неявного расширения путем вызова coder.noImplicitExpansionInFunction в необходимой функции.

    type DisableImpExpinFunction.m
    function out = DisableImpExpinFunction(a,b)
    coder.noImplicitExpansionInFunction;
    out = a + b;
    end
    

    Задайте функциональный ImpExpinFuntion это вычисляет сложение двух операндов с включенным неявным расширением.

    type ImpExpinFunction.m
    function out = ImpExpinFunction(a,b)
    out = a + b;
    end
    

    Задайте фиксированный размер и входной тип переменного размера для этих функций.

    a = coder.typeof(1,[2 1]);
    b = coder.typeof(1,[2 inf]);

    Сгенерируйте код для функций при помощи этих команд:

    codegen DisableImpExpinFunction -args {a,b} -config:lib -lang:c++ -report
    Code generation successful: To view the report, open('codegen/lib/DisableImpExpinFunction/html/report.mldatx')
    
    codegen ImpExpinFunction.m -args {a,b} -config:lib -lang:c++ -report
    Code generation successful: To view the report, open('codegen/lib/ImpExpinFunction/html/report.mldatx')
    

    Сравните сгенерированный код для функций

    Чтобы применить неявное расширение, сгенерированный код вводит дополнительный код, чтобы автоматически расширить операнды. Различие между сгенерированным кодом для двух функций показывают в этом коде.

    type codegen/lib/DisableImpExpinFunction/DisableImpExpinFunction.cpp
    //
    // File: DisableImpExpinFunction.cpp
    //
    // MATLAB Coder version            : 5.3
    // C/C++ source code generated on  : 25-Aug-2021 05:29:13
    //
    
    // Include Files
    #include "DisableImpExpinFunction.h"
    #include "coder_array.h"
    
    // Function Definitions
    //
    // Arguments    : const double a[2]
    //                const coder::array<double, 2U> &b
    //                double out[2]
    // Return Type  : void
    //
    void DisableImpExpinFunction(const double a[2],
                                 const coder::array<double, 2U> &b, double out[2])
    {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
    }
    
    //
    // File trailer for DisableImpExpinFunction.cpp
    //
    // [EOF]
    //
    
    type codegen/lib/ImpExpinFunction/ImpExpinFunction.cpp
    //
    // File: ImpExpinFunction.cpp
    //
    // MATLAB Coder version            : 5.3
    // C/C++ source code generated on  : 25-Aug-2021 05:29:18
    //
    
    // Include Files
    #include "ImpExpinFunction.h"
    #include "coder_array.h"
    
    // Function Definitions
    //
    // Arguments    : const double a[2]
    //                const coder::array<double, 2U> &b
    //                coder::array<double, 2U> &out
    // Return Type  : void
    //
    void ImpExpinFunction(const double a[2], const coder::array<double, 2U> &b,
                          coder::array<double, 2U> &out)
    {
      int loop_ub;
      out.set_size(2, b.size(1));
      loop_ub = b.size(1);
      for (int i{0}; i < loop_ub; i++) {
        out[2 * i] = a[0] + b[2 * i];
        out[2 * i + 1] = a[1] + b[2 * i + 1];
      }
    }
    
    //
    // File trailer for ImpExpinFunction.cpp
    //
    // [EOF]
    //
    

    Когда неявное расширение включено, сгенерированный код включает дополнительный код, чтобы изменить размер операндов, как замечено в ImpExpinFunction. Если неявное расширение отключено, сгенерированный код не включает дополнительный код, чтобы применить любые изменения размера в операндах, как замечено в DisableImpExpinFunction.

    Сравните размер выходных переменных в отчете генерации кода. Выражение, присваивающее out переменная в DisableImpExpinFunction имеет размер 2x1.

    Выражение, присваивающее out переменная в ImpExpinFunction имеет размер 2x:?.

    Введенный в R2021b