coder.sameSizeBinaryOp

Примените поэлементные бинарные операции без неявного расширения

    Описание

    пример

    result = coder.sameSizeBinaryOp(func_handle,u,v) выполняет проверку на ошибки, что операнды одного размера, и применяет бинарную операцию или функцию, заданную указателем на функцию func_handle на операндах u и v неявно не расширяя их. Операнды должны быть одного размера, потому что эта функция не позволяет скалярное расширение.

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

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

    Примеры

    свернуть все

    Используйте coder.sameSizeBinaryOp применять бинарные операции и функции, где неявное расширение не требуется.

    Используя coder.sameSizeBinaryOp гарантирует, что любые операнды переменного размера совместимых размеров не расширены автоматически. Сгенерированный код не включает дополнительный код, чтобы включить автоматическое расширение операндов.

    В этом примере, plus функция применяет операцию с неявным расширением. coder.sameSizeBinaryOp функция применяет операцию без неявного расширения.

    type addExample.m
    function [out1,out2] = addExample(a,b)
    out1 = coder.sameSizeBinaryOp(@plus,a,b);
    out2 = plus(a,b);
    end
    

    Задайте входные типы.

    a_type = coder.typeof(1,[5 1]);
    b_type = coder.typeof(1,[5 inf]);

    Сгенерируйте код для функционального addExample при помощи этой команды.

    codegen addExample -args {a_type, b_type} -config:lib -report
    Code generation successful: To view the report, open('codegen/lib/addExample/html/report.mldatx')
    

    Сравните Выходные размеры

    В отчете генерации кода, созданном на предыдущем шаге, установите свой курсор на эти две операции.

    Размер выхода от plus операцией является 5x:? тогда как размер выхода coder.sameSizeBinaryOp 5x1.

    plus функция неявно расширяет свои операнды до выходного размера.

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

    Исследуйте сгенерированный код

    type codegen/lib/addExample/addExample.c
    /*
     * File: addExample.c
     *
     * MATLAB Coder version            : 5.3
     * C/C++ source code generated on  : 25-Aug-2021 05:27:54
     */
    
    /* Include Files */
    #include "addExample.h"
    #include "addExample_emxutil.h"
    #include "addExample_types.h"
    
    /* Function Definitions */
    /*
     * Arguments    : const double a[5]
     *                const emxArray_real_T *b
     *                double out1[5]
     *                emxArray_real_T *out2
     * Return Type  : void
     */
    void addExample(const double a[5], const emxArray_real_T *b, double out1[5],
                    emxArray_real_T *out2)
    {
      const double *b_data;
      double *out2_data;
      int i;
      int i1;
      int i2;
      int loop_ub;
      b_data = b->data;
      for (i = 0; i < 5; i++) {
        out1[i] = a[i] + b_data[i];
      }
      i = out2->size[0] * out2->size[1];
      out2->size[0] = 5;
      out2->size[1] = b->size[1];
      emxEnsureCapacity_real_T(out2, i);
      out2_data = out2->data;
      loop_ub = b->size[1];
      for (i = 0; i < loop_ub; i++) {
        for (i1 = 0; i1 < 5; i1++) {
          i2 = i1 + 5 * i;
          out2_data[i2] = a[i1] + b_data[i2];
        }
      }
    }
    
    /*
     * File trailer for addExample.c
     *
     * [EOF]
     */
    

    Код, сгенерированный, чтобы вычислить out1 при помощи coder.sameSizeBinaryOp замечен в первом for цикл в функциональном addExample. Код, сгенерированный, чтобы вычислить out2 замечен ниже первого for цикл. Сгенерированный код для out1 намного меньше, по сравнению с кодом, сгенерированным, чтобы вычислить out2.

    Код сгенерирован для plus функционируйте нуждается в дополнительном коде, чтобы расширить его операнды.

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

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

    Этот пример подсвечивает различие между кодом, сгенерированным для coder.sameSizeBinaryOp и код сгенерирован для minus функция.

    Вычитание двух операндов с неявным расширением

    Для этого фрагмента кода сгенерированный код неявно расширяет выход.

    type fooImpEx.m
    function out = fooImpEx(a,b)
    out = b - a;
    end
    

    Задайте типы операнда.

    a = coder.typeof(1,[2 1])
    a = 
    coder.PrimitiveType
       2×1 double
    
        Edit Type Object
    
    b = coder.typeof(1,[2 inf])
    b = 
    coder.PrimitiveType
       2×:inf double
    
        Edit Type Object
    

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

    codegen fooImpEx -config:lib -args {a,b}
    Code generation successful.
    

    Код сгенерирован для функционального fooImpEx показан здесь.

    type codegen/lib/fooImpEx/fooImpEx.c
    /*
     * File: fooImpEx.c
     *
     * MATLAB Coder version            : 5.3
     * C/C++ source code generated on  : 25-Aug-2021 05:30:31
     */
    
    /* Include Files */
    #include "fooImpEx.h"
    #include "fooImpEx_emxutil.h"
    #include "fooImpEx_types.h"
    
    /* Function Definitions */
    /*
     * Arguments    : const double a[2]
     *                const emxArray_real_T *b
     *                emxArray_real_T *out
     * Return Type  : void
     */
    void fooImpEx(const double a[2], const emxArray_real_T *b, emxArray_real_T *out)
    {
      const double *b_data;
      double *out_data;
      int i;
      int i1;
      int loop_ub;
      b_data = b->data;
      i = out->size[0] * out->size[1];
      out->size[0] = 2;
      out->size[1] = b->size[1];
      emxEnsureCapacity_real_T(out, i);
      out_data = out->data;
      loop_ub = b->size[1];
      for (i = 0; i < loop_ub; i++) {
        out_data[2 * i] = b_data[2 * i] - a[0];
        i1 = 2 * i + 1;
        out_data[i1] = b_data[i1] - a[1];
      }
    }
    
    /*
     * File trailer for fooImpEx.c
     *
     * [EOF]
     */
    

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

    Вычитание двух операндов того-же-размера без неявного расширения

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

    type fooSameSize.m
    function out = fooSameSize(a,b)
    out = coder.sameSizeBinaryOp(@minus,b,a);
    end
    

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

    codegen fooSameSize -config:lib -args {a,b}
    Code generation successful.
    

    Код сгенерирован для функционального fooImpEx показан здесь.

    type codegen/lib/fooSameSize/fooSameSize.c
    /*
     * File: fooSameSize.c
     *
     * MATLAB Coder version            : 5.3
     * C/C++ source code generated on  : 25-Aug-2021 05:30:33
     */
    
    /* Include Files */
    #include "fooSameSize.h"
    #include "fooSameSize_types.h"
    
    /* Function Definitions */
    /*
     * Arguments    : const double a[2]
     *                const emxArray_real_T *b
     *                double out[2]
     * Return Type  : void
     */
    void fooSameSize(const double a[2], const emxArray_real_T *b, double out[2])
    {
      const double *b_data;
      b_data = b->data;
      out[0] = b_data[0] - a[0];
      out[1] = b_data[1] - a[1];
    }
    
    /*
     * File trailer for fooSameSize.c
     *
     * [EOF]
     */
    

    В этом случае, переменная out фиксированный размер и код, сгенерированный для операции, примененной coder.sameSizeBinaryOp функция не расширяет операнды. Сгенерированный функциональный fooSameSize не содержит дополнительные циклы, чтобы увеличить размер операндов.

    Входные параметры

    свернуть все

    Двоичная функция, чтобы применяться в виде указателя на функцию, func_handle должен быть двоичный файл (2D вход) поэлементная функция формы C = func_handle(u,v) это принимает массивы u и v с тем-же-размером. Примените эти двоичные функции без неявного расширения при помощи coder.sameSizeBinaryOp:

    ФункцияСимволОписание
    plus+Плюс
    minus-Минус,
    times.*Массив умножается
    rdivide./Правый массив делится
    ldivide.\Левый массив делится
    power.^Степень массивов
    eq==Равный
    ne~=Не равный
    gt>Больше, чем
    ge>=Больше, чем равный
    lt<Меньше, чем
    le<=Менее, чем равный
    and&Поэлементный логический AND
    or|Поэлементный логический OR
    xorN/AЛогическое исключающее ИЛИ
    bitandN/AПобитовое И
    bitorN/AПобитовое ИЛИ
    bitxorN/AПобитовое исключающее ИЛИ
    maxN/AБинарный максимум
    minN/AБинарный минимум
    modN/AМодуль после деления
    remN/AОстаток после деления
    atan2N/AОбратный тангенс с четырьмя квадрантами; приведите к радианам
    atan2dN/AОбратный тангенс с четырьмя квадрантами; закончитесь в градусах
    hypotN/AКвадратный корень из суммы квадратов

    Пример: result = coder.sameSizeBinaryOp(@plus, u, v);

    Типы данных: function_handle

    Входной массив в виде скаляра, вектора, матрицы или многомерного массива. Входные параметры u и v должен иметь те же размеры.

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
    Поддержка комплексного числа: Да

    Входной массив в виде скаляра, вектора, матрицы или многомерного массива. Входные параметры u и v должен иметь те же размеры.

    Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
    Поддержка комплексного числа: Да

    Введенный в R2021b
    Для просмотра документации необходимо авторизоваться на сайте