Примените поэлементные бинарные операции без неявного расширения
выполняет проверку на ошибки, что операнды одного размера, и применяет бинарную операцию или функцию, заданную указателем на функцию 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.mfunction [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.mfunction 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.mfunction 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.