主要内容

coder.sameSizeBinaryOp

在不隐式展开的情况下应用面向元素的二进制操作

    描述

    例子

    结果= coder.sameSizeBinaryOp (func_handleuv执行一个错误检查,检查操作数是否具有相同的大小,并应用函数句柄指定的二进制操作或函数func_handle在操作数uv而不是含蓄地扩大它们。操作数必须具有相同的大小,因为该函数不允许标量展开。

    使用coder.sameSizeBinaryOp禁用特定二进制运算或函数的隐式展开。禁用隐式扩展,以避免输出大小的自动更改、额外的代码生成和性能变化。看到启用隐式展开生成代码优化生成代码中的隐式扩展基本操作的兼容数组大小

    若要禁用生成代码中特定函数中的所有二进制操作和函数的隐式展开,请调用coder.noImplicitExpansionInFunction在这个函数。

    例子

    全部折叠

    使用coder.sameSizeBinaryOp在不需要隐式展开的地方应用二元运算和函数。

    使用coder.sameSizeBinaryOp确保任何大小兼容的可变大小操作数不会自动展开。生成的代码不包括用于自动扩展操作数的附加代码。

    在这个例子中+函数以隐式展开方式应用该操作。的coder.sameSizeBinaryOp函数应用该操作而不进行隐式展开。

    类型addExample.m
    function [out1,out2] = addExample(a,b) out1 = coder.sameSizeBinaryOp(@plus,a,b); / /输出out2 = + (a, b);结束

    定义输入类型。

    a_type =编码器。类型of(1,[5 1]); b_type = coder.typeof(1,[5 inf]);

    为函数生成代码addExample使用此命令。

    codegenaddExamplearg游戏{a_type, b_type}配置:自由报告
    代码生成成功:要查看报告,打开('codegen/lib/addExample/html/report.mldatx')

    比较输出大小

    在上一步创建的代码生成报告中,将光标放在两个操作上。

    的输出的大小+操作是5 x: ?而产量的大小coder.sameSizeBinaryOp5 x1

    +函数将其操作数隐式扩展为输出大小。

    coder.sameSizeBinaryOp函数禁用隐式展开以防止操作数的自动展开。

    检查生成的代码

    类型codegen / lib / addExample / addExample.c
    /* * File: addexample_c * * MATLAB codeder version: 5.3 * C/ c++ source code generated on: 01-Sep-2021 08:19:28 */ /* Include Files */ # Include " addexample_emxutil_h " # Include "addExample_types.h" /*函数定义*/ * *参数: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;双* out2_data;int我;int i1;int i2;int loop_ub;b_data = b - >数据;For (i = 0;我< 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] */

    生成计算的代码着干活通过使用coder.sameSizeBinaryOp是在第一个函数中的循环addExample.生成计算的代码out2是在第一个下面吗循环。生成的代码着干活与生成的计算代码相比,要小得多吗out2

    生成的代码+函数需要额外的代码来扩展其操作数。

    这个示例演示了如何在不隐式展开操作数的情况下为二进制操作和函数生成代码。

    coder.sameSizeBinaryOp函数应用所需的操作,并绕过与隐式展开相关的额外代码生成和输出大小更改。

    这个例子强调了为coder.sameSizeBinaryOp生成的代码-函数。

    用隐式展开法减去两个操作数

    对于此代码片段,生成的代码隐式地展开输出。

    类型fooImpEx.m
    function out = fooImpEx(a,b) out = b - a;结束

    定义操作数类型。

    一个=编码器。类型of(1,[2 1])
    一个=编码器。PrimitiveType 2×1双编辑类型对象
    b =编码器。类型of(1,[2 inf])
    b =编码器。PrimitiveType 2×:inf double编辑类型对象

    通过运行以下命令生成函数代码:

    codegenfooImpEx配置:自由arg游戏{a、b}
    代码生成成功。

    为函数生成的代码fooImpEx显示在这里。

    类型codegen / lib / fooImpEx / fooImpEx.c
    / * *文件:fooImpEx.c * * MATLAB编码器版本:5.3 * C / c++源代码生成:01 - 9月- 2021年08:23:04 * / / *包含文件* / # Include“fooImpEx.h”# Include“fooImpEx_emxutil.h”# Include " fooImpEx_types.h " / * / / * * *函数定义参数:const双a [2] * const emxArray_real_T * * emxArray_real_T * *返回类型:void */ void fooImpEx(const double a[2], const emxArray_real_T *b, emxArray_real_T *out) {const double *b_data;双* out_data;int我;int i1;int loop_ub;b_data = b - >数据;I = out->size[0] * out->size[1];——>大小[0]= 2;——>大小[1]= b - >大小[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在不使用隐式展开的情况下应用操作。

    类型fooSameSize.m
    function out = fooSameSize(a,b) out = code . samesizebinaryop (@minus,b,a);结束

    通过运行以下命令生成函数代码:

    codegenfooSameSize配置:自由arg游戏{a、b}
    代码生成成功。

    为函数生成的代码fooImpEx显示在这里。

    类型codegen / lib / fooSameSize / fooSameSize.c
    / * *文件:fooSameSize.c * * MATLAB编码器版本:5.3 * C / c++源代码生成:01 - 9月- 2021年08:23:08 * / / *包含文件* / # Include“fooSameSize.h”# Include " fooSameSize_types.h " / * / / * * *函数定义参数:const双a [2] * const emxArray_real_T * *双[2]*返回类型:void */ void fooSameSize(const double a[2], const emxArray_real_T *b, double out[2]) {const double *b_data;b_data = b - >数据;Out [0] = b_data[0] - a[0];Out [1] = b_data[1] - a[1];/* * * * [EOF] */

    这里是变量固定尺寸和为操作生成的代码是否被应用coder.sameSizeBinaryOp函数不展开操作数。生成的函数fooSameSize不包含增加操作数大小的附加循环。

    输入参数

    全部折叠

    要应用的二进制函数,指定为函数句柄,func_handle必须是二进制(双输入)元素的函数形式吗C = func_handle (u, v)接受数组uv与同样大小。应用这些二元函数而不需要隐式展开coder.sameSizeBinaryOp

    函数 象征 描述
    + + +
    - - -
    .* 数组相乘
    rdivide ./ 对数组划分
    ldivide .\ 离开数组划分
    权力 .^ 数组权力
    情商 == 平等的
    ~ = 不平等的
    gt > 大于
    通用电气 >= 大于等于
    lt < 不到
    <= 小于等于
    Element-wise逻辑和
    | Element-wise逻辑或
    xor N/A 逻辑异或
    bitand N/A 位操作,
    bitor N/A 位操作或
    bitxor N/A 位操作XOR
    马克斯 N/A 二进制最大
    最小值 N/A 二进制最低
    国防部 N/A 后模分裂
    快速眼动 N/A 后剩下的部门
    量化 N/A 四象限逆切;导致弧度
    atan2d N/A 四象限逆切;导致度
    函数的 N/A 平方根的平方根

    例子:结果=编码器。sameSizeBinaryOp (@plus, u, v);

    数据类型:function_handle

    输入数组,指定为标量、向量、矩阵或多维数组。输入uv必须是相同大小的。

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑|字符|字符串|结构体|表格|细胞|function_handle|分类|datetime|持续时间|calendarDuration|fi
    复数的支持:金宝app是的

    输入数组,指定为标量、向量、矩阵或多维数组。输入uv必须是相同大小的。

    数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑|字符|字符串|结构体|表格|细胞|function_handle|分类|datetime|持续时间|calendarDuration|fi
    复数的支持:金宝app是的

    介绍了R2021b