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
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
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.
Quelques conseils:
for fruit = [fieldnames][1](fruits)'
{:}
Équivaut à cell2mat
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é.
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.
En cherchant dans le fichier strjoin.m j'ai trouvé ceci:
string = [x{:}];