Примените поэлементные бинарные операции без неявного расширения
выполняет проверку на ошибки, что операнды одного размера, и применяет бинарную операцию или функцию, заданную указателем на функцию 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
— Двоичная функция, чтобы применятьсяДвоичная функция, чтобы применяться в виде указателя на функцию, 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 |
xor | N/A | Логическое исключающее ИЛИ |
bitand | N/A | Побитовое И |
bitor | N/A | Побитовое ИЛИ |
bitxor | N/A | Побитовое исключающее ИЛИ |
max | N/A | Бинарный максимум |
min | N/A | Бинарный минимум |
mod | N/A | Модуль после деления |
rem | N/A | Остаток после деления |
atan2 | N/A | Обратный тангенс с четырьмя квадрантами; приведите к радианам |
atan2d | N/A | Обратный тангенс с четырьмя квадрантами; закончитесь в градусах |
hypot | N/A | Квадратный корень из суммы квадратов |
Пример: result = coder.sameSizeBinaryOp(@plus, u, v);
Типы данных: function_handle
u
— Входной массивВходной массив в виде скаляра, вектора, матрицы или многомерного массива. Входные параметры 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
Поддержка комплексного числа: Да
v
— Входной массивВходной массив в виде скаляра, вектора, матрицы или многомерного массива. Входные параметры 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
Поддержка комплексного числа: Да
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.