2017-10-28 78 views
6

W programie Matlab można ocenić dowolny ciąg znaków jako kod za pomocą funkcji eval. Na przykład.Funkcja repla Matlaba

s = '{1, 2, ''hello''}' % char 
c = eval(s)    % cell 

Czy istnieje sposób na wykonanie operacji odwrotnej; uzyskanie dosłownej reprezentacji ciągów dowolnej zmiennej? To znaczy odzyskać s z c? Coś

s = repr(c) 

Taki repr funkcją jest wbudowany w Pythonie, ale nie natrafiłem czymś takim w Matlab, ani nie widzę wyraźny sposób, jak wdrożyć go samodzielnie.

Najbliższy rzeczą, wiem coś takiego jak disp(c) który wypisuje reprezentację c, ale w formacie „czytelny” w przeciwieństwie do dosłownej formie kodu.

+0

Nie sądzę, że można to zrobić w matlab w ten sposób, może w inny sposób. Ze względu na funkcje mantry * są obywatelami 1. klasy * możesz to zrobić w Pythonie. Tak nie jest w przypadku programu Matlab. – percusse

+0

Dlaczego jest to czynnik ograniczający? –

+0

Wtedy nie można podłączyć funkcji jako argumentu do innego.Możesz to zrobić na przykład za pomocą uchwytów funkcji za pomocą funkcji 'functions()'. – percusse

Odpowiedz

2

zależności od dokładnie, dlaczego chcesz to zrobić, Twój przypadek użycia może być rozwiązana z matlab.io.saveVariablesToScript

Here jest doc dla niego.

Nadzieję, że pomaga!

+0

** Bardzo ** cool. Jednak dwie skargi: wynikowy plik '.m' buduje złożone struktury danych zamiast zapisywania ich jako literałów jednoliniowych i wydaje się, że wyniki muszą być zapisane w pliku, podczas gdy ja wolałbym wynik jako łańcuch. Poza tym, jest to jak dotąd najlepsza odpowiedź. –

3

OK, widzę twój ból.

Moja rada nadal będzie zapewnić funkcję sortowania toString lewarowanie na fprintf, sprint i przyjaciół, ale rozumiem, że może to być uciążliwe, jeśli nie wiem, typ danych i wymaga również kilka subcases .

W celu uzyskania szybkiej poprawki można użyć funkcji evalc z wymienioną funkcją disp.

Coś jak to powinno działać:

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

Or zwięźle

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

Rzeczywiście "evalc" jest jedną z części rozwiązania. I tak, wygląda na to, że można zhakować coś razem na wzór [toString] (https://se.mathworks.com/matlabcentral/fileexchange/38566-string-representation-of-any-data-type), chociaż wymagałoby sporo pracy. –

+0

@jmd_dk, yup: Poradziłbym sobie na sposób "toString". Jeśli masz czas (i jesteś gotów pójść tą ścieżką) prawdopodobnie zidentyfikowałbym podstawową klasę twoich danych, następnie rozmiar, a następnie utworzę ciąg zgodnie z rozmiarem (np.). Możesz nawet użyć iscell, ischar itd. Innym sposobem jest przejście do trybu OOP i zawijanie danych wokół klasy, która definiuje twoją metodę "toString"; na przykład definiujesz klasę "PrintableData", a następnie poprzez dziedziczenie implementujesz "PrintableCell", "PrintableArray" itd. Tylko kilka myśli (które prawdopodobnie już brałeś pod uwagę). –

6

Najbliższy jest w Matlab jest mat2str, który pracuje dla numerycznej, charakteru lub logicznych tablicach 2D (włącznie z wektorami). (Nie działa w przypadku macierzy ND, macierzy komórek, tablic struktury lub tabel).

Przykłady:

>> 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 

W tym related question and answers widać:

  • A funkcję napisałem do uzyskania reprezentację ciąg tablic komórek 2D z dowolnie zagnieżdżonych komórki, numerycznej, char lub tablic logicznych .
  • Jak zrobić to, co chcesz w Octave dla dowolnych typów danych.