2013-01-09 10 views
17

Czy w Matlab istnieje składnia literału wieloliniowego lub czy konieczne jest łączenie wielu linii?Multiline string literal w Matlab?

Znalazłem pakiet verbatim, ale działa on tylko w m-pliku lub funkcji, a nie interaktywnie w komórkach edytora.

EDYCJA: Jestem szczególnie po odczytaniu i łatwości modyfikacji literału w kodzie (wyobraź sobie, że zawiera on wcięte bloki różnych poziomów) - łatwo jest tworzyć łańcuchy wielowierszowe, ale szukam najbardziej dogodnego sytax do robienia że.

tej pory mają

t = {... 
'abc'... 
'def'}; 
t = cellfun(@(x) [x sprintf('\n')],t,'Unif',false); 
t = horzcat(t{:}); 

co daje wielkość (t) = 1: 8, ale jest oczywiście trochę nieładzie.

EDYCJA 2: Zasadniczo verbatim robi to, co chcę, oprócz tego, że nie działa w komórkach edytora, ale może najlepiej będzie zaktualizować go tak, aby działał. Myślę, że powinno być możliwe uzyskanie aktualnego otwartego pliku i pozycji kursora z interfejsu Java do edytora. Problem polegałby na tym, gdyby w tej samej komórce było wiele połączeń słownych, jak byś je rozróżniał.

+0

Nie jestem pewien, czy podążam za pytaniem. czy możesz dodać przykłady, które wyjaśniają Twój cel? – Shai

+2

Shai: Chcę wprowadzić literał ciągów wielowierszowych, takich jak '" "" 'w Pythonie: np. Aby skopiować i wkleić blok tekstu (zachowując wcięcie) z innego źródła do ciągu matlab – robince

Odpowiedz

6

Matlab jest dziwak w tym przetwarzania uciec strun jest funkcją rodziny funkcji zamiast składni ciągiem znaków printf. I bez literałów multilinicznych. No cóż.

Skończyło się na zrobieniu dwóch rzeczy. Najpierw wykonaj funkcje CR() i LF(), które po prostu wracają przetworzone \ ri \ n, abyś mógł użyć ich jako pseudo-literałów w swoim kodzie. Wolę robić to w ten sposób, zamiast wysyłać całe ciągi przez sprintf(), ponieważ mogą istnieć inne odwrotne ukośniki, które nie powinny być przetwarzane jako sekwencje specjalne (np. Jeśli niektóre z twoich ciągów pochodzą z argumentów funkcji lub danych wejściowych odczytanych z innych źródeł).

function out = CR() 
out = char(13); % # sprintf('\r') 

function out = LF() 
out = char(10); % # sprintf('\n'); 

drugie, dokonać join(glue, strs) funkcję, która działa jak Perl przyłączyć lub cellfun/code horzcat w przykładzie, ale bez końcowego separatora spływu.

function out = join(glue, strs) 
strs = strs(:)'; 
strs(2,:) = {glue}; 
strs = strs(:)'; 
strs(end) = []; 
out = cat(2, strs{:}); 

Następnie używaj go z literaturą komórki tak jak Ty.

str = join(LF, { 
    'abc' 
    'defghi' 
    'jklm' 
    }); 

Nie potrzebujesz elips "..." w takich literałach komórki; Pominięcie ich powoduje pionową konstrukcję wektorową i jest w porządku, jeśli wiersze mają różną długość ciągów znaków, ponieważ każdy z nich utknął w komórce. Już samo to powinno zaoszczędzić trochę pisania.

+2

Używam Matlab r2007b i linii cat (1, strs {:}); nie jest przetwarzany zgodnie z oczekiwaniami, dostaję "wymiary argumentów CAT nie są spójne.". Czy to może być spowodowane moją starą wersją Matlaba? – RobertG

+0

Cóż, dla mnie, używając funkcji char char (1, strs {:}); zamiast tego wydaje się działać. – RobertG

+0

@RobertG: Masz rację - powinno to być 'cat (2, strs {:})' lub 'horzcat (strs {:})'. Głupie niedopatrzenie; Przepraszam. Naprawiony. Wywołanie 'char (1, strs {:})' prawdopodobnie wytworzy wyściełaną tablicę charytatywną 2-D zamiast jednego długiego wektora znakowego z osadzonymi znakami nowej linii, co może być również użyteczne, ale nie jest to, co robiłem z 'join '() '. ("Cat (1, ...)" będzie działać, jeśli wszystkie twoje ciągi wejściowe będą miały taką samą długość jak OP, ale wynik będzie w niewłaściwym formacie). –

12

pójdę do:

multiline = sprintf([ ... 
'Line 1\n'... 
'Line 2\n'... 
]); 
+1

Domyślam się, że handluje szykami komórek do dodawania nowych linii ręcznie, ale prawie ten sam pomysł ... zarówno kopiowanie i wklejanie literalnego bloku trochę bólu! – robince

+0

Uzyskaj edytor, który można zrobić, wyszukaj/zamień na wyrażenie regularne, a następnie zamień \ n na \\ n \ "... \ n \ ' –

+1

Możesz użyć http://undocumentedmatlab.com/blog/editormac-assign-a-keyboard-macro-in-the-matlab-editor/ do specjalnego wklejenia twojego tekstu do edytora programowo , dokonując niezbędnej substytucji.s –