Quando si genera il codice C utilizzando il codificatore MATLAB, il comportamento è diverso quando un if
si trova nel corpo di un altro if
o nella sua sezione else
. Il caso seguente crea facilmente il codice C con uscita con dimensioni 5x5:Come la generazione del codice MATLAB diminuisce le dimensioni di output con i rami nidificati
function y = foo1(u)
if u > 0
y = zeros(2,2);
else
y = zeros(5,5);
end
Ora questo funziona così
function y = foo2(u,v)
if u > 0
y = zeros(2,2);
else
y = zeros(5,5);
if v > 0
y = 2 * y;
end
end
Ma questo non riesce a generare il codice, lamentando non corrispondente dimensione:
function y = foo3(u,v)
if u > 0
y = zeros(2,2);
if v > 0
y = 2 * y;
end
else
y = zeros(5,5);
end
Qui è l'uscita in linea di comando:
>> codegen foo1.m -args {0}
>> codegen foo2.m -args {0,0}
>> codegen foo3.m -args {0,0}
??? Size mismatch (size [2 x 2] ~= size [5 x 5]).
The size to the left is the size of the left-hand side of the assignment.
Error in ==> foo3 Line: 8 Column: 5
Code generation failed: Open error report.
Error using codegen (line 144)
Ho visto questo comportamento in MATLAB R2013b e R2015a.
Giusto per chiarire, poiché non è stato menzionato esplicitamente: 'coder.varsize ('y', [5,5])' specifica '[5 5]' come * limite superiore * per la dimensione variabile della matrice . È anche possibile specificare una o più dimensioni come fisse e altre come dimensioni variabili - questo e altro nella pagina della documentazione collegata nella risposta. – mikkola
Vale la pena notare che nessuno degli esempi nell'OP è valido C. Le variabili dichiarate all'interno di un'istruzione if avranno un ambito separato in C. Poiché questo codice funziona in Matlab, si può sperare che il codificatore matlab sia in grado di risolverlo, ma non si può supporre questo. Direi che il problema in 'foo3' ha a che fare con che' y' è usato nell'istruzione if ('y = 2 * y') e quindi ridefinito nell'istruzione else, che è scritta in seguito nel testo. Penso che questo confonda il programmatore Matlab. Non sono del tutto sicuro però. – patrik
@patrik, non è necessario che gli esempi siano validi C. Il lavoro di MATLAB Coder è di produrre C validi dal sottoinsieme del linguaggio MATLAB supportato per codegen. Detto questo, dichiarare le variabili MATLAB in primo piano, in modo simile allo stile C, può rendere il codice più facile da comprendere per Coder. –