2017-10-28 5 views
6

In Matlab kann man einen beliebigen String als Code mit der eval Funktion auswerten. Z.B.Matlab repr Funktion

Gibt es eine Möglichkeit, die umgekehrte Operation zu tun; die literale String-Repräsentation einer beliebigen Variable erhalten? Das heißt, erholen s von c? So etwas wie

s = repr(c) 

Solch eine repr Funktion ist in Python gebaut, aber ich habe über etwas Vergleichbares in Matlab nicht kommen, noch sehe ich einen klaren Weg, wie es selbst zu implementieren.

Das nächste, was ich weiß, ist etwas wie disp(c), die eine Darstellung von c druckt, aber in einem "lesbaren" Format im Gegensatz zu einem literalen Code-Format.

+0

Ich glaube nicht, dass Sie es so in Matlab auf diese Weise tun können, vielleicht auf andere Weise. Wegen der Mantra * -Funktionen sind Bürger 1. Klasse * können Sie es in Python tun. Dies ist bei Matlab nicht der Fall. – percusse

+0

Warum ist das ein begrenzender Faktor? –

+0

Dann können Sie eine Funktion nicht als Argument an ein anderes anschließen.Sie können dies zum Beispiel mit Funktions-Handles tun, die die 'functions()' -Funktion verwenden. – percusse

Antwort

2

Je nach genau, warum Sie dies tun wollen, kann Ihr Anwendungsfall mit matlab.io.saveVariablesToScript aufgelöst werden, damit es

Here ist die Doc.

Hoffe, dass hilft!

+0

** Sehr ** cool. Zwei Beschwerden allerdings: Die resultierende '.m' Datei baut komplexe Datenstrukturen auf, anstatt sie als einzeilige Literale auszugeben, und die Ergebnisse scheinen in einer Datei gespeichert zu werden, während ich das Ergebnis lieber als String vorziehen würde. Abgesehen davon ist dies die beste Antwort bisher. –

3

OK, ich sehe deinen Schmerz.

Mein Rat wäre, noch eine Funktion der Art von toString leveraging bietet auf fprintf, sprint und Freunden, aber ich verstehe, dass es sehr mühsam sein kann, wenn Sie die Art der Daten nicht kennen und erfordert auch mehrere Unterfälle .

Für eine schnelle Lösung können Sie evalc mit der disp Funktion verwenden, die Sie erwähnten.

So etwas sollte funktionieren:

function out = repr(x) 
    out = evalc('disp(x)'); 
end 

Oder kurz und bündig

repr = @(x) evalc('disp(x)'); 
+0

Tatsächlich ist 'Evalc' ein Teil der Lösung. Und ja, es sieht so aus, als könnte man etwas zusammen in den Zeilen von [toString] hacken (https://se.mathworks.com/matlabcentral/fileexchange/38566-string-representation-of-any-data-type), obwohl dies der Fall ist würde ziemlich viel Arbeit erfordern. –

+0

@jmd_dk, yup: Ich würde den 'toString' Weg empfehlen. Wenn Sie Zeit haben (und bereit sind, diesen Pfad zu gehen), würde ich wahrscheinlich die zugrunde liegende Klasse Ihrer Daten identifizieren, dann Größe und dann eine Zeichenfolge entsprechend der Größe (z. B.) erstellen. Sie könnten sogar iscell, ischar usw. verwenden. Ein anderer Weg wäre, den OOP-Weg zu gehen und Ihre Daten um eine Klasse zu wickeln, die Ihre toString-Methode definiert; z.B. Sie definieren eine "PrintableData" -Klasse und implementieren dann durch Vererbung "PrintableCell", "PrintableArray" usw. Nur ein paar Gedanken (die Sie möglicherweise bereits berücksichtigt haben). –

6

Die nächstgelegene es in Matlab ist mat2str, die für nummerisch, Zeichen oder logische 2D-Arrays (einschließlich Vektoren arbeitet). (Es funktioniert nicht für ND-Arrays, Zellenarrays, Struct-Arrays oder Tabellen).

Beispiele:

>> a = [1 2; 3 4]; ar = mat2str(a), isequal(eval(ar), a) 
ar = 
    '[1 2;3 4]' 
ans = 
    logical 
    1 

>> a = ['abc'; 'def']; ar = mat2str(a), isequal(eval(ar), a) 
ar = 
    '['abc';'def']' 
ans = 
    logical 
    1 

In diesem related question and answers können Sie sehen:

  • Eine Funktion, die ich mit beliebig verschachtelte Zelle, numerisch, char oder logische Arrays für den Erhalt einer String-Darstellung von 2D-Zellen-Arrays geschrieben .
  • Wie Sie in Octave für beliebige Datentypen tun, was Sie wollen.