2011-03-18 5 views
6

Un titre, hein? Disons que j'ai une matrice de vecteurs (n X 1), A, et une matrice de vecteurs contenant des indices dans A, appelée B. Je souhaite extraire un tableau de cellules, C, tel que C{i} = [A{B{i}}].
En d'autres termes, j'ai une matrice de tableaux d'indices, et je veux extraire les matrices correspondant aux concaténations des vecteurs en A indexés par chacun de ces tableaux d'indices.MATLAB: indexer un tableau de cellules avec un tableau de cellules de tableaux et retourner un tableau de cellules

for i = 1:length(B) 
    %# B{i} is an array of indices, C{i} is a matrix 
    C{i} = [ A{ B{i} } ]; 
end 

La boucle est équivalente à:

C = cellfun(@(x)[A{x}],B,'UniformOutput',false); %# implicit for loop w/ closure 

Puis-je faire en utilisant une expression d'indexation seul? Ou au moins sans la boucle? Je pense que deal() pourrait être impliqué mais ne peut pas le comprendre.

Répondre

6

Voici deux solutions alternatives:

  • Ramassez tous les indices de B ensemble avec la fonction cell2mat, indexer le contenu de A pour faire une grande matrice, puis diviser ce tapis Rix à l'aide de la fonction mat2cell et les dimensions des tableaux d'index dans B:

    N = size(A{1});      % Size of an array in A 
    M = cellfun('prodofsize', B);   % Array of sizes of elements in B 
    C = mat2cell([A{cell2mat(B)}], N, M); 
    
  • est ici une version plus compacte de votre cellfun solution à base:

    C = cellfun(@(x) {[A{x}]}, B); 
    

En fin de compte, je voudrais décider quelle solution utiliser en fonction de la vitesse et de la lisibilité, ce qui peut s'avérer être votre solution basée sur la boucle.

+0

+1 Bien se débarrasser de 'UniformOutput', 'faux'. Quelle horreur. –

0

Essayez l'expression suivante:

C = A(cell2mat(B)) 

Vous pouvez consulter le blog de Loren à propos Cell Arrays and Their Contents

+0

Cette expression fait un tableau de cellules avec chaque élément un seul vecteur de 'A'. Je veux créer un tableau de cellules avec chaque élément une matrice composée de vecteurs de 'A' correspondant aux indices d'un élément de' B'. –

Questions connexes