web-dev-qa-db-fra.com

comment convertir une cellule en chaîne dans matlab

Supposons que j'ai une cellule

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

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

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

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

et je veux le convertir en un tableau de cellules en utilisant une chaîne de format pour chaque élément: ' %.5f'

Comment puis-je faire ceci? J'ai essayé l'approche suivante, mais j'obtiens une erreur:

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

Je reçois une erreur comme ???

Error using ==> sprintf

Function is not defined for 'cell' inputs.

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

Quelqu'un peut-il m'aider à l'avance

18
user1804229

La chaîne est un tableau de cellules

Eh bien, pas vraiment .. C'est une matrice, mais continuez à lire.

Je suppose que le tableau de cellules est le type de données le plus mystique de MATLAB. Alors disons démystifier un peu ;-)

Présumer

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

Tout d'abord, l'indexation entière n'est pas nécessaire pour les petits tableaux. Il vaut mieux utiliser foreach - comme des constructions. En effet,

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

est équivalent à

for fruit = fruits
    fruit
end

droite?

Enfin, pas tout à fait. La première boucle produit des chaînes, tandis que la seconde donne des cellules. Vous pouvez le vérifier avec

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

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

, c'est-à-dire [1 0] et [0 1].

Si vous avez repéré la différence, alors vous devez savoir quoi faire avec l'exemple suivant (dans celui-ci, c'est vraiment lié à votre question (!) Je le promets!). Supposons que vous essayez de faire une concaténation horizontale en boucle:

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

Tu auras

ans = 

    'banana'    'is a fruit'

etc. Pourquoi? Apparemment, ce code essaie de concaténer un tableau de cellules imbriqué en une chaîne (un tableau de cellules contenant une matrice de caractères qui constituent la chaîne comme "banane"). Donc, la bonne réponse est

Utilisation {:}

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

Magiquement, cela produit déjà l'attendu 'la banane est un fruit' , 'la pomme est un fruit' , etc.

Conseils

Quelques conseils:

  • La boucle sans index fonctionne bien avec les structures comme dans for fruit = [fieldnames][1](fruits)'
  • Ce qui précède est vrai pour l'open source octave
  • la banane n'est pas seulement un fruit, taxonomiquement c'est aussi une herbe ;-) tout comme 'banane' dans MATLAB est à la fois une chaîne et une matrice, c'est-à-dire affirmer (isstr ('banane') && ismat ('banane')) passe, mais assert (iscell ('banana')) échoue.
  • {:} Équivaut à cell2mat

PS

une solution à votre question peut ressembler à ceci:

Donné

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

convertir uniquement les types numériques d'index en chaînes

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

Au-dessus des sorties de code

vcell =

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

qui peut être concaténé.

21
Yauhen Yakimovich

Supposons que nous ayons une cellule comme suit:

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

Nous pouvons en extraire la chaîne simplement en utilisant le {:} opérateur directement dessus.

   class(my_cell{:})
    ans =
    char

Notez que nous pouvons utiliser l'expression mycell{:} partout où nous utiliserions une chaîne normale.

7
merlin2011

En cherchant dans le fichier strjoin.m j'ai trouvé ceci:

string = [x{:}];
2
Dieter

Essaye ça:

sprintf('   %.5f',x{:})

(Fonctionne selon certains résultats Google .)

2
Lynn