Ich vermisse manchmal eine Funktion, um eine String-Repräsentation eines (möglicherweise verschachtelten) Zellen-Arrays zu erzeugen. Es wäre eine Verallgemeinerung von mat2str
, die nur für Nicht-Zellen-Arrays (von numerisch, char oder logischer Typ).
Wie erhalten Sie für ein Array
ergibtx
eine Zeichenfolgendarstellungy
, sodass die Auswertung dieser Zeichenfolgex
?
Zum Beispiel die Eingabe
%Vor%sollte eine Ausgabezeichenfolge wie
erzeugen %Vor%(oder eine Variation bezüglich des Abstandes eines Separators), so dass
%Vor% ist true
.
Dieser Prozess, bei dem eine Datenstruktur in eine Zeichenfolge umgewandelt wird, die später ausgewertet werden kann, heißt Serialisierung .
>Es gibt eine Serialisierungsfunktion für Octave , die für diesen Zweck verwendet werden kann und jeden Kerndatentyp unterstützt (nicht nur Zellenarrays) mit einer beliebigen Anzahl von Dimensionen (nicht nur 2d).
Beispiele:
%Vor% Eine bessere Frage ist jedoch warum möchten Sie dies in erster Linie tun ? Wenn Sie Variablen zwischen mehreren Instanzen von Octave senden möchten, sollten Sie die Parallelen und
Die folgende Funktion funktioniert für beliebige Arrays mit jeder Verschachtelungsstruktur und für jede Form der Arrays, solange sie alle 2D-Arrays sind. Mehrdimensionale Arrays werden nicht unterstützt (wie mat2str
).
Die Funktion ermöglicht auch die Angabe beliebiger Zeilen- und Spaltentrennzeichen für Zellenarrays (z. B. zur Auswahl zwischen Komma und Leerzeichen) und optional das Erzwingen dieser Trennzeichen auch für Nicht-Zellenarrays (wodurch das Verhalten von mat2str
überschrieben wird). Standardtrennzeichen in Zellenfeldern sind ' '
für Spalten und '; '
für Zeilen.
Die obige Funktion verwendet reguläre Ausdrücke, um die angegebenen Trennzeichen in Nicht-Zellen-Arrays zu erzwingen. Dies funktioniert in Matlab, aber nicht in Octave, aufgrund von Einschränkungen in unterstützten Lookbehind-Mustern. Die folgende modifizierte Version vermeidet reguläre Ausdrücke und funktioniert daher in Matlab und Octave. Nur der Teil zwischen if sep_noncell
und dem übereinstimmenden end
ändert sich in Bezug auf die erste Version.
Ich habe einen nicht-rekursiven Ansatz gewählt, weil ich mit Iteration normalerweise komfortabler bin als mit Rekursion.
Die Ausgabe wird schrittweise aufgebaut, indem Teilstrings oder leere Arrays ( []
) in einem Zellenarray ( y
) beibehalten werden. Ein leeres Array in einer Zelle von y
zeigt an, dass "eine weitere Verarbeitung erforderlich ist". Teilstrings definieren die "Struktur" oder eventuell den numerischen, Zeichen- oder logischen Inhalt in der tiefsten Ebene der Zellenverschachtelung.
In jeder Iteration wird das erste leere Array, das in y
gefunden wurde, durch den tatsächlichen Inhalt oder durch Teilstrings und andere leere Arrays ersetzt, die später verarbeitet werden. Wenn y
kein leeres Array enthält, endet der Prozess, und alle Teilstrings von y
werden verkettet, um die endgültige Zeichenfolgenausgabe zu erhalten.
Beispiel: Bei der Eingabe x = {[10 20], {'abc'; false; true;}};
und dem Aufruf von y = array2str(x)
ist das Array y
in jedem Schritt ein Zellen-Array, das Folgendes enthält:
und letzteres wird schließlich in die Zeichenfolge
verkettet %Vor% Als Beispiel mit benutzerdefinierten Trennzeichen würde array2str(x, ', ', '; ', true)
Tags und Links string arrays matlab octave cell-array