2016-07-20 13 views
1

Ich habe einen fein abgestimmten Algorithmus in MATLAB, der auf Matrizen (natürlich) arbeitet. Ich habe Matlab-Codierer verwendet, um c-Code für diesen Algorithmus zu generieren, und es funktioniert wie erwartet.Mit Matlab Coder generierten Algorithmus für die Produktion

Hier ist ein Funktionsaufruf, die ich in Matlab

x = B/A 

wobei

  • B der Größe 1 * 500 verwendet (Zeilen * Spalten)
  • A mit einer Größe von 10 * 500
  • x, das Ergebnis ist von Größe 1 * 10

Wenn dies mit Matlab Coder in C-Quelle konvertiert wird. Ich habe festgestellt, dass die Funktionsdefinition Parameter akzeptiert, die den obigen Größen entsprechen.

void myfunction(const double B[500], const double A[5000], double x[10]) 

Für Prototypen und Testzwecke scheint dies in Ordnung. In der Produktion bevorzuge ich jedoch, diese Funktion auch für andere Größen zu verwenden. Zum Beispiel sollte 100 anstelle von 500 in den oben genannten Variablen auch funktionieren. Wie kann ich die Abhängigkeit von Matrixdimensionen in meinem Algorithmus entfernen?

Darüber hinaus gibt es einige Codezeilen, die hartcodierte Ganzzahlen verwenden. Zum Beispiel ist es Code wie

if (rankR <= 1.4903363393874656E-8) 
// Some internal function calls 
else 
// Usage of standard sqrt 

oder

500.0 * fabs(A[0]) * 2.2204460492503131E-16 

Könnte jemand erklären, was sind diese hart codiert ganze Zahlen? Werden diese aus den Testdaten generiert, die ich in MATLAB verwendet habe?

Antwort

1

Wenn der Funktionsaufruf, auf den Sie verweisen, die Einstiegspunktfunktion ist, können Sie die Größe beim Einrichten des Coders festlegen. Die einfachste Möglichkeit, den Coder auszuführen, ist die Verwendung der GUI aus dem Menü "Apps" in MATLAB (oder geben Sie "coder" an der Konsole ein). Nachdem Sie die Einstiegspunktfunktion festgelegt haben, definieren Sie in Schritt 2 den Typ und die Größe für jede der Eingabevariablen.

Für jede Dimension Ihrer Eingangsgröße (es kann mehr als 2, wenn notwendig sein), können Sie die angeben:

n - dimension is exactly n long 
:n - dimension is up to n long 
inf - dimension is unbounded 

Wenn der Funktionsaufruf nicht die Funktion der Einstiegspunkt ist, und ist im Inneren vergraben Ihr Code (oder wenn Sie die codegen Funktion aus der Konsole ausgeführt wird), können Sie explizit Variablen als von unterschiedlicher Größe definieren:

coder.varsize('myVariableName'); 

beachten Sie, dass einige Funktionen nur (mit Coder) verwendet werden können, mit fixe d-große Eingänge.

Fuller Beschreibung hier: http://uk.mathworks.com/help/fixedpoint/ug/defining-variable-size-data-for-code-generation.html#br9t627

nicht sicher über die zufälligen Konstanten leider.