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.
strada da percorrere! Mai dire che la gravedigging non ha mai aiutato nessuno. –
chiamata chiamata funzione superfluo 'sprintf' a hack - è un lol –