Проверяйте свой код на эти проблемы:
Присвоение матриц Переменного Размера к матрицам фиксированного размера
Вы не можете присвоить матрицы переменного размера матрицам фиксированного размера в сгенерированном коде. Рассмотрите этот пример:
function Y = example_mismatch1(n) %#codegen assert(n < 10); B = ones(n,n); A = magic(3); A(1) = mean(A(:)); if (n == 3) A = B; end Y = A;
Компиляция этой функции производит эту ошибку:
??? Dimension 1 is fixed on the left-hand side but varies on the right ...
Существует несколько способов зафиксировать эту ошибку:
Позвольте матричному A
расти путем добавления построения coder.varsize
:
function Y = example_mismatch1_fix1(n) %#codegen coder.varsize('A'); assert(n < 10); B = ones(n,n); A = magic(3); A(1) = mean(A(:)); if (n == 3) A = B; end Y = A;
Явным образом ограничьте размер матричного B
к 3х3 путем изменения оператора assert
:
function Y = example_mismatch1_fix2(n) %#codegen coder.varsize('A'); assert(n == 3) B = ones(n,n); A = magic(3); A(1) = mean(A(:)); if (n == 3) A = B; end Y = A;
Используйте явную индексацию, чтобы сделать B
тем же размером как A
:
function Y = example_mismatch1_fix3(n) %#codegen assert(n < 10); B = ones(n,n); A = magic(3); A(1) = mean(A(:)); if (n == 3) A = B(1:3, 1:3); end Y = A;
Пустая матрица, измененная форму, чтобы совпадать со спецификацией Переменного Размера
Если вы присваиваете пустой матричный []
данным переменного размера, MATLAB® может тихо изменить данные в сгенерированном коде, чтобы совпадать со спецификацией coder.varsize
. Например:
function Y = test(u) %#codegen Y = []; coder.varsize('Y', [1 10]); if u < 0 Y = [Y u]; end
В этом примере coder.varsize
задает Y
как вектор-столбец до 10 элементов, таким образом, его первая размерность фиксируется в размере 1. Оператор Y = []
определяет первую размерность Y
как 0, создавая несоответствие. Правая сторона присвоения является пустой матрицей, и левая сторона является вектором переменного размера. В этом случае MATLAB изменяет пустой матричный Y = []
в сгенерированном коде к Y = zeros(1,0)
, таким образом, это совпадает со спецификацией coder.varsize
.
Выполнение бинарных операций на фиксированном и операндах Переменного Размера
Вы не можете выполнить бинарные операции на операндах различных размеров. Операнды имеют различные размеры, если вы зафиксировали размерности, и другой имеет переменные размерности. Например:
function z = mismatch_operands(n) %#codegen assert(n >= 3 && n < 10); x = ones(n,n); y = magic(3); z = x + y;
Когда вы компилируете эту функцию, вы получаете ошибку, потому что y
зафиксировал размерности (3 x 3), но x
имеет переменные размерности. Решите эту проблему при помощи явной индексации, чтобы сделать x
тем же размером как y
:
function z = mismatch_operands_fix(n) %#codegen assert(n >= 3 && n < 10); x = ones(n,n); y = magic(3); z = x(1:3,1:3) + y;
Проверяйте свой код на эти проблемы:
Используя непостоянные размерности в матричном конструкторе
Можно задать данные переменного размера путем присвоения переменной матрице с непостоянными размерностями. Например:
function y = dims_vary(u) %#codegen if (u > 0) y = ones(3,u); else y = zeros(3,1); end
Однако компиляция этой функции генерирует ошибку, потому что вы не задавали верхнюю границу для u
.
Существует несколько способов решить проблему:
Включите динамическое выделение памяти и перекомпилируйте. Во время генерации кода MATLAB не проверяет на верхние границы, когда это использует динамическое выделение памяти для данных переменного размера.
Если вы не хотите использовать динамическое выделение памяти, добавьте оператор assert
перед первым использованием u
:
function y = dims_vary_fix(u) %#codegen assert (u < 20); if (u > 0) y = ones(3,u); else y = zeros(3,1); end
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.