0

J'ai une cellule avec différents types de variables (double & chaînes), je veux arrondir les éléments numériques dans la cellule. round La fonction peut fonctionner uniquement avec des tableaux et non avec des cellules, donc j'essaie d'utiliser cell2mat - mais cette fonction ne peut pas être utilisée dans le cas de différents types d'éléments dans la cellule.Arrondir uniquement les éléments numériques dans le tableau de cellules avec différents types de données

Une idée comment puis-je arrondir les éléments numériques dans cette cellule? Bien sûr, je ne veux pas faire de boucle sur les éléments de la cellule.

+0

Vous ne pouvez pas faire cela sans boucler afaik. Vous pouvez utiliser 'cellfun', mais ce n'est qu'une boucle déguisée. Les cellules sont notoirement difficiles à utiliser si vous voulez éviter les boucles. – Adriaan

Répondre

1

Comme mentionné par Adriaan, cela peut être fait avec cellfun:

function testCell = q38476362 

    testCell = {'t','h',1.004,'s',[],'i',4.99,[],'a',[],'ce',10.8}; 
    isnum = cellfun(@(x)~isempty(x) & isnumeric(x),testCell); 
    testCell(isnum) = num2cell(round([testCell{isnum}],0)); 

testCell = 

    't' 'h' [1] 's' [] 'i' [5] [] 'a' [] 'ce' [11] 

Si votre réseau de cellules est aléatoire en termes de string s et où sont les double s, il n'y a pas grand-chose que vous pouvez faire en plus de boucle/cellfun/bruteforce. Si toutefois, il y a une certaine périodicité (par exemple, "une chaîne est toujours suivie par deux entrées"), vous pourriez être en mesure de construire un vecteur d'indexation qui vous donnerait les valeurs sans avoir à itérer (explicitement ou implicitement).

+0

c'est ace 12: D – GameOfThrows

+0

Dev-iL, merci, votre réponse est géniale mais ne fonctionne pas pour moi dans le cas où cette cellule contienne aussi des éléments vides ([]) – erez

+0

@erez Voir la mise à jour de la réponse. –

1

Vous souhaitez tirer parti de la capacité str2double pour convertir des types non numériques en NaN.

Supposons que vous avez une cellule comme:

A = {'1.999','3.1415','pie','??'} 
B = round(str2double(A)) 

B = 

2  3 NaN NaN