Hauptinhalt

coder.findOrError

Ermitteln von Indizes und Werten von Nicht-Null-Elementen in einem Array in generiertem C/C++ Code

Seit R2026a

Beschreibung

k = coder.findOrError(X,n) gibt die ersten n linearen Indizes zurück, die den Nicht-Null-Elementen im Array X entsprechen. Wenn Sie lediglich das Argument X angeben, verwendet coder.findOrError den Standardwert 1 für n.

  • Wenn es sich bei X um einen Vektor handelt, dann ist k ein Vektor mit derselben Ausrichtung wie X.

  • Wenn es sich bei X um ein mehrdimensionales Array handelt, dann ist k ein Spaltenvektor.

  • Wenn X zum Zeitpunkt der Codegenerierung eine Matrix variabler Größe und zur Laufzeit ein Zeilenvektor ist, dann ist die Ausgabe der generierten MEX-Funktion ein Spaltenvektor und kein Zeilenvektor.

Bei der Ausführung in MATLAB® gilt: Wenn das Array X weniger als n Nicht-Null-Elemente enthält, weist coder.findOrError das gleiche Verhalten wie find auf. Bei solchen Eingaben führt die Codegenerierung entweder zu einem Kompilierungs- oder zu einem Laufzeitfehler.

Hinweis

Im Gegensatz zur find-Funktion, die bei der Codegenerierung stets Vektoren variabler Länge zurückgibt, gibt die coder.findOrError-Funktion Vektoren mit fester Länge n zurück, wenn das Argument n während der Codegenerierung eine Konstante ist. Wenn das Array X weniger als n Nicht-Null-Elemente enthält, löst coder.findOrError entweder einen Kompilierungs- oder einen Laufzeitfehler aus.

Beispiel

Wenn direction auf 'last' gesetzt ist, ermittelt k = coder.findOrError(X,n,direction) die letzten n Indizes der Nicht-Null-Elemente in X. Die Standardeinstellung für direction lautet 'first', d. h. es werden die ersten n Indizes der Nicht-Null-Elemente ermittelt.

Beispiel

[row,col] = coder.findOrError(___) gibt mithilfe eines der Eingabeargumente aus den vorangegangenen Syntaxformen die Zeilen- und Spaltenindizes der Nicht-Null-Elemente im Array X zurück.

[row,col,v] = coder.findOrError(___) gibt zudem den Vektor v zurück, der die Nicht-Null-Elemente in X enthält.

Beispiel

Beispiele

alle reduzieren

In diesem Beispiel ermitteln Sie die linearen Indizes der ersten n Nicht-Null-Elemente einer Matrix fester Größe, wobei n während der Codegenerierung eine Konstante ist. Da es sich bei n um eine Konstante handelt, ist die Ausgabe von coder.findOrError ein Vektor fester Größe mit der Länge n. In diesem Beispiel wird 3 als Wert für n verwendet.

Definieren Sie eine Einstiegsfunktion locateFirstThreeNonzeroElements, die die linearen Indizes der ersten drei Nicht-Null-Elemente einer 3×4-Matrix zurückgibt.

function k = locateFirstThreeNonzeroElements(X)
arguments
    X (3,4) double
end

k = coder.findOrError(X,3);
end

Da die erwartete Anzahl der Nicht-Null-Elemente eine Konstante ist, weist die Ausgabe k im generierten Code eine feste Größe von 3 auf. Zudem weist das Eingabe-Array X ebenfalls eine feste Größe auf. Die Unterstützung für Arrays mit variabler Größe können Sie daher deaktivieren, wenn Sie Code für diese Funktion generieren.

Erstellen Sie eine MEX-Funktion für locateFirstThreeNonzeroElements, die ausschließlich Arrays mit fester Größe verwendet.

cfg = coder.config("mex");
cfg.EnableVariableSizing = false;
codegen -config cfg locateFirstThreeNonzeroElements
Code generation successful.

Führen Sie die generierte MEX-Funktion mit einem 3×4-Eingabe-Array aus. Die Funktion gibt die linearen Indizes der ersten drei Nicht-Null-Elemente des Eingabe-Arrays zurück.

locateFirstThreeNonzeroElements_mex([0 1 1 0; 0 0 0 0; 1 0 1 0])
ans =

  3×1 int32 column vector

   3
   4
   7

Führen Sie die generierte MEX-Funktion mit einem anderen 3×4-Eingabe-Array aus, das nur zwei Nicht-Null-Elemente enthält. Die Funktion löst einen Laufzeitfehler aus.

locateFirstThreeNonzeroElements_mex([0 1 0 0; 0 0 0 0; 1 0 0 0])
Function coder.findOrError expects 3 non-zero elements, but receives 2.

In diesem Beispiel ermitteln Sie die Werte der letzten n Nicht-Null-Elemente eines unbegrenzten Zeilenvektors variabler Größe, wobei der Wert von n zur Laufzeit bereitgestellt wird. Da es sich bei n bei der Codegenerierung nicht um eine Konstante handelt, ist die Ausgabe von coder.findOrError ein Vektor variabler Größe.

Definieren Sie eine Einstiegsfunktion findLastNNonzeroElements, die die Werte der letzten n Nicht-Null-Elemente eines unbegrenzten Zeilenvektors variabler Größe zurückgibt X.

function v = findLastNNonzeroElements(X,n)
arguments
    X (1,:) double
    n (1,1) double
end

[~,~,v] = coder.findOrError(X,n,"last");
end

Erstellen Sie eine MEX-Funktion für findLastNNonzeroElements mit den Standardkonfigurationseinstellungen. Da das Eingabe-Array X eine unbegrenzte, variable Größe aufweist, muss der generierte Code sowohl die Unterstützung für Daten variabler Größe als auch die dynamische Speicherzuweisung aktivieren.

codegen findLastNNonzeroElements
Code generation successful.

Führen Sie die generierte MEX-Funktion mit Beispiel-Eingabewerten aus. Die Funktion gibt die linearen Indizes der ersten vier Nicht-Null-Elemente des Eingabe-Vektors zurück.

findLastNNonzeroElements_mex([1 3 0 0 0 3 4 2 0],4)
ans =

     3     3     4     2

Eingabeargumente

alle reduzieren

Eingabe-Array, angegeben als Skalar, Vektor, Matrix oder mehrdimensionales Array.

Datentypen: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char
Unterstützung komplexer Zahlen: Ja

Anzahl der zu suchenden Nicht-Null-Elemente, angegeben als positiver ganzzahliger Skalar.

Suchrichtung, angegeben als String "first" oder "last". Suchen Sie mithilfe von find(X,n,"last") nach den letzten n Nicht-Null-Elementen in X.

Ausgabeargumente

alle reduzieren

Indizes der Nicht-Null-Elemente, zurückgegeben als Vektor aus int32-Werten.

Mithilfe von X(k) können Sie die Nicht-Null-Werte in X zurückgeben.

Zeilenindizes, zurückgegeben als Vektor aus int32-Werten. Gemeinsam legen row und col die X(row,col)-Indizes fest, die den Nicht-Null-Elementen in X entsprechen.

Spaltenindizes, zurückgegeben als Vektor aus int32-Werten. Gemeinsam legen row und col die X(row,col)-Indizes fest, die den Nicht-Null-Elementen in X entsprechen.

Wenn es sich bei X um ein mehrdimensionales Array mit N > 2 handelt, dann ist col ein linearer Index über die N-1 nachfolgenden Dimensionen von X. Dadurch bleibt die Beziehung X(row(i),col(i)) == v(i) erhalten.

Nicht-Null-Elemente von X, zurückgegeben als Vektor.

Erweiterte Fähigkeiten

alle erweitern

C/C++ Codegenerierung
Generieren Sie C und C++ Code mit MATLAB® Coder™.

GPU-Codegenerierung
Generieren von CUDA® Code für NVIDIA® Grafikprozessoren mit dem GPU Coder™.

Versionsverlauf

Eingeführt in R2026a

Siehe auch