2011-03-18 21 views
6

Algunos títulos, ¿eh?
Supongo que tengo una matriz de celdas de vectores (n X 1), A y una matriz de celdas de vectores que contienen índices en A, llamado B. Deseo extraer una matriz de celdas, C, tal que C{i} = [A{B{i}}].
En otras palabras, tengo una matriz de celdas de matrices de índices, y quiero sacar las matrices correspondientes a las concatenaciones de los vectores en A indexados por cada una de esas matrices de índices.MATLAB: indice una matriz de celdas con una matriz de celdas de matrices y devuelve una matriz de celdas

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

El bucle es equivalente a:

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

¿Puedo hacer que el uso de una expresión de indexación solo? ¿O al menos sin el bucle?
Creo que deal() podría estar involucrado pero no puede resolverlo.

Respuesta

6

Aquí hay dos soluciones alternativas:

  • recoger todos los índices de B junto con la función cell2mat, indexe los contenidos de A para hacer una matriz grande, luego divida esa estera Rix mediante la función mat2cell y los tamaños de las matrices de índice en 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); 
    
  • Aquí es una versión más compacta de su solución basada en cellfun:

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

En última instancia, lo haría decida qué solución utilizar en función de la velocidad y la legibilidad, lo que en realidad podría ser su solución basada en bucle for.

+0

+1 Bonito deshacerse de 'UniformOutput', 'false'. Qué monstruosidad. –

0

Prueba el siguiente expresión:

C = A(cell2mat(B)) 

Usted puede echar un vistazo a el blog de Loren sobre Cell Arrays and Their Contents

+0

Esta expresión hace que una matriz de celdas con cada elemento sea un solo vector de 'A'. Quiero crear una matriz de celdas con cada elemento una matriz compuesta de vectores de 'A' que corresponden a los índices en un elemento de' B'. –

Cuestiones relacionadas