2012-05-01 4 views
0

J'ai donc un réseau de cellules de vecteurs X:Octave/MATLAB: étendues variables et recherche de noms?

octave:149> X 
X = 
{ 
    [1,1] = 

     1 17 20 

    [2,1] = 

     5 20 22 27 

    [3,1] = 

     2 17 18 21 

} 

créer un autre vecteur vide Y:

octave:150> Y = [] 
Y = [](0x0) 

J'appelle alors une fonction anonyme sur chaque valeur de X avec « Y = unique, ([Y x]) ":

octave:151> cellfun(@(x)(Y = unique([Y x])),X,'UniformOutput',false) 
ans = 
{ 
    [1,1] = 

     1 17 20 

    [2,1] = 

     1 5 17 20 22 27 

    [3,1] = 

     1 2 5 17 18 20 21 22 27 

} 

Ok, mais maintenant Y est encore vide:

octave:152> Y 
Y = [](0x0) 
octave:153> 

clairement le nom Y dans la fonction anonyme créé et lié un nouveau stockage pour sa propre version de Y.

Quelles sont les règles de stockage et de résolution de noms dans Octave/Matlab? Quand le stockage est-il alloué pour une variable? Quand deux noms identiques sont-ils liés à la même variable? (Y at-il un moyen d'affecter la valeur de Y dans la fonction anonyme ci-dessus?)

Répondre

1

Dans Matlab, les fonctions ont leur propre étendue. Lorsque vous transmettez une variable, sauf si cette variable est également dans la liste de sortie, elle ne sera pas modifiée par la fonction appelée; la fonction fait une copie de la variable et la copie est ce que la fonction modifie.

Avec des fonctions anonymes, la variable est copiée à la déclaration de fonction. Voir this Matlab documentation. C'est ce que vous voyez avec Y.

Aussi, je pense que vous utilisez incorrectement cellfun. Vous ne devez pas renvoyer la valeur de la fonction anonyme dans l'appel à cellfun, mais à la suite de cellfun.

Alors, peut-être cela est plus proche de ce que vous voulez:

octave:151> Y = cellfun(@(x, y)(unique([y x])),X,Y,'UniformOutput',false) 

Je ne peux pas dire si vous voulez que le résultat de chaque appel à la fonction anonyme pour changer Y et utiliser ce résultat dans le prochain appel . Si c'est ce que vous voulez, ce sera plus difficile.

+0

J'essaye de "l'union" accumuler les vecteurs dans le tableau de cellules. A la fin, Y devrait être égal à [1 2 5 17 18 20 21 22 27] ' –

+0

C'est-à-dire que je veux obtenir l'union des vecteurs dans le tableau de cellules. –

+1

Si vous n'avez besoin que de l'ensemble d'étapes sans étapes intermédiaires, vous pouvez utiliser ce qui suit: 'Y = unique ([X {:}])'. Cela utilise le fait que Matlab peut créer des tableaux à partir de [listes séparées par des virgules] (http://www.mathworks.co.uk/help/techdoc/matlab_prog/br2js35-1.html#br2js35-9). Cette solution suppose que tous les vecteurs à l'intérieur de la cellule sont '1xn'. – AE426082

Questions connexes