2013-01-09 8 views
17

Esiste una sintassi di stringa letterale multilinea in Matlab o è necessario concatenare più righe?Stringa letterale multilinea in Matlab?

Ho trovato il pacchetto verbatim, ma funziona solo in un file m o in una funzione e non in modo interattivo all'interno delle celle dell'editor.

EDIT: Io sono particolarmente dopo la leggibilità e la facilità di modificare il letterale nel codice (immagina che contenga blocchi rientrati di diversi livelli) - è facile creare stringhe multilinea, ma sto cercando la più comoda sytax per fare quella.

Finora ho

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

che dà dimensioni (t) = 1 8, ma è ovviamente un po 'di confusione.

MODIFICA 2: Fondamentalmente, verbatim fa ciò che voglio tranne che non funziona nelle celle dell'Editor, ma forse la mia migliore scommessa è di aggiornarlo così fa. Penso che dovrebbe essere possibile ottenere il file aperto corrente e la posizione del cursore dall'interfaccia java all'editor. Il problema sarebbe se ci fossero più chiamate verbali nella stessa cella come si farebbe a distinguerle.

+0

Non sono sicuro di seguire la tua domanda. puoi aggiungere alcuni esempi che potrebbero chiarire il tuo obiettivo? – Shai

+2

Shai: Voglio inserire una stringa multistringa come "" "" "in Python: ad es. Per copiare e incollare un blocco di testo (mantenendo il rientro) da un'altra fonte in una stringa matlab. – robince

risposta

6

Matlab è uno stravagante in questo processo di fuga nelle stringhe è una funzione della printf famiglia di funzioni al posto della sintassi letterale stringa. E niente letterali multilinea. Oh bene.

Ho finito per fare due cose. Per prima cosa, rendi le funzioni CR() e LF() che restituiscono rispettivamente processate \ r e \ n, così puoi usarle come pseudo-letterali nel tuo codice. Preferisco fare in questo modo piuttosto che mandare intere stringhe tramite sprintf(), perché potrebbero esserci altri backslash che non si desidera vengano elaborati come sequenze di escape (ad esempio se alcune stringhe derivano da argomenti di funzione o input letti da altrove).

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

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

In secondo luogo, fare una funzione join(glue, strs) che funziona come il Perl di aderire o il cellfun/code horzcat nel tuo esempio, ma senza il separatore finale finale.

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

E quindi utilizzarlo con i letterali come te.

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

Non è necessario il "..." ellissi in letterali di cella come questo; omettendoli ha una costruzione vettoriale verticale, e va bene se le file hanno lunghezze diverse di stringhe di caratteri, perché sono tutte bloccate all'interno di una cella. Questo da solo dovrebbe farti risparmiare un po 'di battitura.

+2

sto usando Matlab r2007b e la linea cat (1, strs {:}); non viene elaborato come previsto, ricevo "le dimensioni degli argomenti CAT non sono coerenti". Questo potrebbe essere dovuto alla mia vecchia versione di Matlab? – RobertG

+0

Bene, per me, usando la funzione call char (1, strs {:}); invece sembra funzionare. – RobertG

+0

@RobertG: hai ragione - dovrebbe essere 'cat (2, strs {:})' o 'horzcat (strs {:})'. Silly oversight; scusa. Fisso. Chiamare 'char (1, strs {:})' probabilmente produrrà un array di 2-D imbottito invece di un lungo vettore char con nuove linee incorporate, che potrebbe anche essere utile, ma non è quello che stavo cercando con 'join() '. (Il 'cat (1, ...)' sembrerà funzionare se tutte le stringhe di input sono della stessa lunghezza come quelle di OP, ma l'output sarà nel formato sbagliato.) –

12

mi piacerebbe andare per:

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

Immagino che scambi l'array di celle per aggiungere manualmente le newline ma più o meno la stessa idea ... entrambi rendono la copia e incolla un blocco letterale un po 'di dolore! – robince

+0

Ottieni un editor che può fare ricerca/sostituzione con espressioni regolari e quindi sostituirlo \ n da \\ n \ '... \ n \' –

+1

Puoi usare http://undocumentedmatlab.com/blog/editormacro-assign-a-keyboard-macro-in-the-matlab-editor/ per incollare in modo speciale il testo nell'editor al livello di programmazione , facendo la necessaria sostituzione.s –