web-dev-qa-db-fra.com

Attribuer une valeur à plusieurs cellules dans matlab

J'ai un vecteur logique 1D, un tableau de cellules et une valeur de chaîne que je veux attribuer.

J'ai essayé "cell {logical} = string" mais j'obtiens l'erreur suivante: 

The right hand side of this assignment has too few values to satisfy
the left hand side.

Avez-vous la solution?

13
Flavian Hautbois

Vous n'avez pas réellement besoin d'utiliser deal

a = cell(10,1); % cell array
b = Rand(1,10)>0.5; % vector with logicals
myString = 'hello'; % string

a(b) = {myString};

En regardant la dernière ligne: à gauche, nous sélectionnons un sous-ensemble de cellules de a et nous leur disons qu'elles doivent toutes être égales à la cellule de droite, qui contient une chaîne.

18
user2000747

Tu peux essayer ça

a = cell(10,1); % cell array
b = Rand(1,10)>0.5; % vector with logicals
myString = 'hello'; % string

[a{b}] = deal(myString);

Il en résulte: 

a = 

    'hello'
         []
         []
    'hello'
    'hello'
         []
    'hello'
    'hello'
         []
         []
14
H.Muster

Comme H.Muster l'a dit, deal est la voie à suivre ici. La raison des crochets est que (suivant la configuration de H.Muster), a{b} renvoie une liste séparée par des virgules; les crochets doivent être placés autour de cette liste pour la concaténer en un vecteur. Exécuter help lists dans Matlab pourrait préciser, de même que la documentation sur listes séparées par des virgules

Edit: Le réponse fourni par l'utilisateur2000747 semble beaucoup plus propre que d'utiliser deal.

7
zroth

Une autre solution peut être

a = cell(10,1);
a([1,3]) = {[1,3,6,10]}

Cela peut sembler être un ajout inutile, mais dites que vous voulez affecter un vecteur à 3 cellules dans un tableau de cellules 1D de longueur 1e8. Si une logique est utilisée, cela nécessiterait la création d'un tableau logique d'une taille proche de 100 Mo.

1
patrik