Generalisierung von mat2str auf Zellen-Arrays

8

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 x eine Zeichenfolgendarstellung y , sodass die Auswertung dieser Zeichenfolge x ?

ergibt

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 .

    
Luis Mendo 24.07.2016, 15:24
quelle

2 Antworten

7

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 mpi Pakete, die Funktionen speziell für diesen Zweck entwickelt haben.

    
carandraug 24.07.2016, 18:18
quelle
4

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.

%Vor%

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.

%Vor%

Wie es funktioniert

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:

%Vor%

und letzteres wird schließlich in die Zeichenfolge

verkettet %Vor%

Als Beispiel mit benutzerdefinierten Trennzeichen würde array2str(x, ', ', '; ', true)

geben %Vor%     
Luis Mendo 24.07.2016 15:24
quelle