Неявное расширение в сгенерированном коде включено по умолчанию. Генератор кода вводит модификации в сгенерированном коде, чтобы выполнить неявное расширение. Изменения в сгенерированном коде могут привести к дополнительному коду, чтобы расширить операнды. Расширение операндов может влиять на эффективность сгенерированного кода. Смотрите Генерируют Код С Enabled Неявным расширением.
Неявное расширение может изменить размер выходных параметров от поддерживаемых операторов и функций, вызывающих размер и ошибки несоответствия типов в вашем рабочем процессе.
Для мелкомодульного управления того, где неявное расширение включено в сгенерированном коде, используйте следующие функции в своем MATLAB® код:
Например, рассмотрите этот фрагмент кода. Функциональный vector_sum
находит сумму двух массивов совместимых размеров.
function out = vector_sum(a,b) out = b + a; end
Типы операндов a и b заданы как:
a_type = coder.typeof(1,[2 1]) %size: 2x1 b_type = coder.typeof(1,[2 Inf]) %size: 2x:inf
Без неявного расширения | С неявным расширением |
---|---|
Без неявного расширения, размера | С неявным расширением, размером переменной |
Эти фрагменты кода обрисовывают в общих чертах изменения в сгенерированном коде для функционального vector_sum
, в то время как неявное расширение отключено и включено. Сгенерировать код, типы операндов a
и b
заданы как:
a_type = coder.typeof(1,[1 Inf]) %size: 1x:inf b_type = coder.typeof(1,[1 Inf]) %size: 1x:inf
Сгенерированный код с отключенным неявным расширением | Сгенерированный код с Enabled неявным расширением |
---|---|
void vector_sum(const emxArray_real_T *a, const emxArray_real_T *b, emxArray_real_T *out) { int i; int loop_ub; i = out->size[0] * out->size[1]; out->size[0] = 1; out->size[1] = b->size[1]; emxEnsureCapacity_real_T(out, i); loop_ub = b->size[1]; for (i = 0; i < loop_ub; i++) { out->data[i] = b->data[i] + a->data[i]; } } |
static void plus(emxArray_real_T *out, const emxArray_real_T *b, const emxArray_real_T *a) { int i; .... if (a->size[1] == 1) { out->size[1] = b->size[1]; } else { out->size[1] = a->size[1]; } .... if (a->size[1] == 1) { loop_ub = b->size[1]; } else { loop_ub = a->size[1]; } for (i = 0; i < loop_ub; i++) { out->data[i] = b->data[i * stride_0_1] + a->data[i * stride_1_1]; } } void vector_sum(const emxArray_real_T *a, const emxArray_real_T *b, emxArray_real_T *out) { int i; int loop_ub; if (b->size[1] == a->size[1]) { i = out->size[0] * out->size[1]; out->size[0] = 1; out->size[1] = b->size[1]; emxEnsureCapacity_real_T(out, i); loop_ub = b->size[1]; for (i = 0; i < loop_ub; i++) { out->data[i] = b->data[i] + a->data[i]; } } else { plus(out, b, a); } } |
coder.noImplicitExpansionInFunction
Если вы требуете неявного расширения в своем проекте, но не в определенных функциях, отключаете неявное расширение для сгенерированного кода этой функции путем вызова coder.noImplicitExpansionInFunction
в функции.
Например, код сгенерирован для vector_sum
не применяет неявное расширение.
КОД MATLAB | Сгенерированный код с coder.sameSizeBinaryOp |
---|---|
function out = vector_sum(a,b) out = coder.sameSizeBinaryOp(@plus, a, b); end a = coder.typeof(1,[1 Inf]) %size: 1x:inf b = coder.typeof(1,[1 Inf]) %size: 1x:inf codegen vector_sum -launchreport -args {a,b} -config:lib |
void vector_sum(const emxArray_real_T *a, const emxArray_real_T *b, emxArray_real_T *out) { int i; int loop_ub; i = out->size[0] * out->size[1]; out->size[0] = 1; out->size[1] = a->size[1]; emxEnsureCapacity_real_T(out, i); loop_ub = a->size[1]; for (i = 0; i < loop_ub; i++) { out->data[i] = a->data[i] + b->data[i]; } } |
Примечание
coder.noImplicitExpansionInFunction
не отключает неявное расширение в вашем коде MATLAB. Это отключает неявное расширение только в сгенерированном коде.
coder.sameSizeBinaryOp
Используйте функцию coder.sameSizeBinaryOp
выполнять проверку на ошибки, чтобы гарантировать, что операнды одного размера и препятствуют тому, чтобы генератор кода генерировал неявно расширенный код для этой функции.
Например, этот фрагмент кода применяется плюс операция при помощи coder.sameSizeBinaryOp
без неявного расширения.
КОД MATLAB | Сгенерированный код |
---|---|
function out = vector_sum(a,b) coder.noImplicitExpansionInFunction(); out = a + b; end a = coder.typeof(1,[1 Inf]) %size: 1x:inf b = coder.typeof(1,[1 Inf]) %size: 1x:inf codegen vector_sum -launchreport -args {a,b} -config:lib |
void vector_sum(const emxArray_real_T *a, const emxArray_real_T *b, emxArray_real_T *out) { int i; int loop_ub; i = out->size[0] * out->size[1]; out->size[0] = 1; out->size[1] = a->size[1]; emxEnsureCapacity_real_T(out, i); loop_ub = a->size[1]; for (i = 0; i < loop_ub; i++) { out->data[i] = a->data[i] + b->data[i]; } } |
coder.sameSizeBinaryOp
не поддерживает скалярное расширение. Операнды даны coder.sameSizeBinaryOp
должно быть одного размера.
Если вы не требуете неявного расширения в своем сгенерированном коде или не хотите, чтобы модификации влияли на ваш сгенерированный код, выключили его путем установки EnableImplicitExpansion
отметьте в своем coder.config
возразите против false
. Этот флаг установлен в true
по умолчанию.
Отключите неявное расширение в своем Simulink® модель путем установки параметра всей модели Enable Implicit Expansion in MATLAB blocks на false
. В качестве альтернативы используйте эту команду:
set_param(gcm,'EnableImplicitExpansion',false);
Примечание
Перед выключением неявного расширения гарантируйте, что внешний код не использует неявное расширение. Отключение неявного расширения для целого проекта может вызвать ошибки при генерации кода, если проект включает код MATLAB из внешних источников.
coder.noImplicitExpansionInFunction
| coder.sameSizeBinaryOp