2012-11-06 7 views
17

Supponiamo che io abbia una cellacome convertire una cella per archi in MATLAB

v = 'v' [576.5818] [3.0286] [576.9270] 

     'v' [576.5953] [3.1180] [576.8716] 

     'f' [  56] [ 58] [  52] 

     'f' [  56] [ 58] [  52] 

e voglio convertire questo a un array di celle utilizzando una stringa di formato per ogni elemento: ' %.5f'

Come posso Fai questo? Ho provato il seguente approccio, ma ottengo un errore:

f1 = @(x) sprintf(' %.5f',x); 
cellfun(f1, num2cell(v),'UniformOutput', false) 

sto ottenendo un errore come ???

Error using ==> sprintf

Function is not defined for 'cell' inputs.

Error in ==> @(x)sprintf(' %.5f',x)

uno può aiutare grazie in anticipo

risposta

21

String è un array di celle

Beh, non proprio .. È una matrice, ma continua a leggere.

Immagino che l'array di celle sia il tipo di dati più mistico in MATLAB. Quindi cerchiamo di demistificare un po ';-)

supponga

fruits = {... 
    'banana',... 
    'apple',... 
    'orange'... 
} 

Prima di tutto indicizzazione intero non è necessario per piccoli array. È molto meglio usare foreach costruzioni -like. Infatti,

for index = 1:numel(fruits) 
    fruits{index} 
end 

è equivalente a

for fruit = fruits 
    fruit 
end 

giusto?

Beh, non proprio. Il primo ciclo produce stringhe, mentre il secondo produce celle. È possibile controllare con

for index = 1:numel(fruits) 
    [isstr(fruits{index}) iscell(fruits{index})] 
end 

for fruit = fruits 
    [isstr(fruit) iscell(fruit)] 
end 

, vale a dire [1 0] e [0 1].

Se hai individuato la differenza, allora devi sapere cosa fare con il prossimo esempio (in questo si tratta in realtà della tua domanda (!) Lo prometto!). Diciamo che tenta di fare la concatenazione orizzontale in un ciclo:

for fruit = fruits 
    [fruit 'is a fruit'] 
end 

Otterrete

ans = 

    'banana' 'is a fruit' 

e così via. Perché? Apparentemente questo codice tenta di concatenare un array di celle nidificate a una stringa (una matrice di celle contenente una matrice di caratteri che costituisce la stringa come "banana").Quindi, la risposta corretta è

Usa {:}

for fruit = fruits 
    [fruit{:} 'is a fruit'] 
end 

Magicamente questo produce già il atteso 'banana è un frutto', 'mela è un frutto', ecc

Hints

alcuni suggerimenti:

  • looping-Index gratuito funziona bene con le strutture come in for fruit = [fieldnames][1](fruits)'
  • Quanto sopra è vero per l'open source ottava
  • banana non è solo frutta, tassonomicamente è anche un'erba ;-) proprio come 'banane' in MATLAB è sia una stringa che una matrice, ovvero assert (isstr ('banana') & & ismat ('banana')) passa, ma asserisce (iscell ('banana')) fallisce.
  • {:} è equivalente a cell2mat

PS

una soluzione alla tua domanda può apparire come segue:

Dato

vcell = {... 
    'v' 576.5818 3.0286 576.9270; 
    'v' 576.5818 3.0286 576.9270  
} 

soli tipi numerici segrete index-saggio in stringhe

vcell(cellfun(@isnumeric, vcell)) = cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false) 

Sopra uscite di codice

vcell =

'v' '576.58180' '3.02860' '576.92700' 
'v' '576.58180' '3.02860' '576.92700' 

che può essere concatenato.

6

Supponiamo di avere una cella come segue:

my_cell = {'Hello World'} 
class(my_cell) 
ans = 
cell 

Siamo in grado di ottenere la stringa di fuori di esso, semplicemente utilizzando l'operatore {:} su di esso direttamente.

class(my_cell{:}) 
    ans = 
    char 

noti che possiamo usare l'espressione mycell{:} ovunque useremmo una stringa normale.

+0

strada da percorrere! Mai dire che la gravedigging non ha mai aiutato nessuno. –

+0

chiamata chiamata funzione superfluo 'sprintf' a hack - è un lol –

2

Guardando nel file strjoin.m ho trovato questo:

string = [x{:}]; 
Problemi correlati