2013-08-22 7 views
2

J'ai un tableau de cellules A [1x80] dans lequel chaque élément est lui-même un tableau de cellules [9x2]. J'ai aussi un vecteur B représentant un groupe de cellules sélectionnées de A et je veux extraire l'élément {2,2} de chaque cellule sélectionnée.Accès aux éléments prédéfinis des cellules

J'ai essayé avec un simple

A (1, B) {2,2}

mais bien sûr, cela ne fonctionne pas .... Pouvez-vous me aider?

+0

Puisque vous avez dit réseau de cellules dans le réseau de cellules, ne devrait pas vous essayer 'A {1, B} {2,2}' la place, et si ce n » t travail 'tmp = A {1, B}; tmp {2,2} '? –

+0

@TobiasKienzler tmp = A {1, B} retourne juste la cellule correspondant au premier élément de B. – gabboshow

+0

si B est [1 3 5] Je voudrais avoir l'élément {2,2} de A {1,1 }, A {1,3} et A {1,5} ... – gabboshow

Répondre

2
+1

@Dan Ah, vrai, votre réponse utilise cellfun pour obtenir l'élément '{2,2}' de chaque cellule et accède aux éléments '(1, B)', mine l'inverse. Je me demande lequel est le plus performant ... Mais cela dépend probablement des dimensions et sous-dimensions –

+0

Si c'était Python, la réponse serait plus compréhensible: '[A [1] [b] [2] [2] pour b en B] ' –

+0

Eh bien, si le PO est concerné par l'efficacité, il est assez facile à tester.Mais plus probablement il/elle devrait simplement choisir celui qui lui semble le plus intuitif. Ils sont très similaires sinon – Dan

3

Que diriez-vous ceci:

A = {{1 2; 3 4}, {5 6;7 8}, {9 0; 1 2}; {3 4; 5 6}, {7 8; 9 0}, {11 22; 33 44}}; 
B = [2,3] 

[cellfun(@(x)x(2,2), A){1, B}] 

ans = 

    8 2 

EDIT:

ci-dessus fonctionne réellement que dans l'octave. Comme @Amro souligne, de le modifier pour travailler dans Matlab, vous devez utiliser une variable temporaire:

temp = cellfun(@(x)x(2,2), A); 
[temp{1, B}] 

ou dans une doublure (grâce aussi à @Amro)

cellfun(@(c)c{2,2}, A(1,B)) 
+1

Je pense que ce sera une erreur dans MATLAB, vous devez utiliser une variable temporaire dans cette dernière déclaration: 'c = cellfun (@ (x) x (2,2), A); [c {1, B}] ' – Amro

+0

@Amro Je viens de le tester, tu as raison! Une fois de plus, j'ai été déjoué en testant dans Octave. – Dan

2

Cette réponse est La même chose que @ Dan, mais en utilisant une boucle simple pour l'amélioration des performances, si nécessaire.

% If you know that the numel of elements returned by {2,2} will always be one: 
nElem = numel(B); 
ret(1,nElem)=0; 

for k=1:nElem 

    ret(k) = A{1,B(k)}{2,2} 

end 

La réponse suivante est erronée, il ne retournera le {2,2} index du premier élément de B

subsref([A{1,B}],struct('type','{}','subs',{{2,2}})) 

qui ressemble plus à ce que vous faites (et n'utilise pas cellfun et arrayfun, ce serait mieux si vous faites cette opération sur une boucle, parce qu'ils sont slow)

Voir la documentation here.

Un chemin plus serait:

temp = [A{1,B}] 
temp{2,2} 
+1

Je reçois seulement l'élément {2,2} du premier élément dans 'B' en utilisant vos deux méthodes ... (c'est-à-dire exécuter sur mon échantillon' A' et 'B' que j'ai posté dans ma solution. = 8', n'obtient pas le '2') – Dan

+0

@Dan Oui, mais si' B' est gros, vous allez faire une grosse boucle en utilisant le 'cellfun' qui ne serait pas très rapide. La sous-référence est la fonction intégrée matlab pour sous-référencer un élément ... – Werner

+0

@Dan ah ok, laissez-moi vérifier – Werner

Questions connexes