2011-05-16 11 views
7

Tengo una matriz de celdas allData que es Nx1. Cada celda contiene una estructura con una propiedad names (el nombre es un objeto personalizado, pero piense en ello como una matriz de celdas de cadenas si lo desea). Me gustaría crear una única matriz de células que contenga todos los nombres. Por ejemplo, si N = 3, de modo que allData es una matriz de células de 3x1, a continuación, la siguiente lograría mi objetivo:¿Cómo concatena matrices de celdas que son parte de una matriz de celdas en MATLAB?

A = allData{1}; 
B = allData{2}; 
C = allData{3}; 

allNames = [A.names B.names C.names]; 

El problema con este enfoque es que N es grande y cambia en función de la entrada, por lo Espero que haya una forma inteligente de hacerlo utilizando cellfun, pero todo lo que he intentado falla (por ejemplo, no funciona para hacer allNames = [cellfun(@(x) {x.names}, allData)];).

ACTUALIZACIÓN: Gracias a las soluciones sugeridas, puedo obtener todo en una matriz de celdas donde cada celda contiene una matriz de celdas. Mi objetivo aquí es concatenar estos. Más o menos, lo que tengo es:

{A.names B.names C.names} 

y lo que yo quiero y parece que no puede conseguir es

{A.names{1} A.names{2} ... A.names{end} B.names{1} ... B.names{end} ...} 

SOLUCIÓN: que necesitaba piezas de cada respuesta a continuación, así que aquí está la solución que funcionó para mí:

de Andrew Lazarus:

allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);

entonces, a partir gnovice:

allNames = vertcat(allNames{:});

Gracias a los dos !!

+0

son el escalar estructuras (es decir, 1 por 1), ¿o pueden ser estructuras * matrices *? – gnovice

+0

Sí, las estructuras son 1x1. – PengOne

Respuesta

4

Hay algunos detalles más sobre el contenido de su celda que serían necesarios para una solución más general, pero si la propiedad names siempre devuelve una matriz de cadenas, y si sus estructuras son todas escalares (es decir1-por-1 un conjunto de estructuras), entonces la siguiente solución usando CELLFUN, CHAR y CELLSTR le dará una serie de células de N-por-1 de cuerdas allNames que contienen todos sus nombres:

allNames = cellfun(@(x) {char(x.names)},allData); 
allNames = cellstr(char(allNames{:})); 

Y es una aquí ejemplo en el que allData contiene tres estructuras diferentes:

>> allData{1} = struct('names',{{'hello'}},'junk',1:3); 
>> allData{2} = struct('names',{{'hi' 'yo' 'hey' 'whassup'}}); 
>> allData{3} = struct('names',{{'howdy';'aloha'}},'junk',4); 
>> allNames = cellfun(@(x) {char(x.names)},allData); 
>> allNames = cellstr(char(allNames{:})) 

allNames = 

    'hello' 
    'hi' 
    'yo' 
    'hey' 
    'whassup' 
    'howdy' 
    'aloha' 

EDIT:

Generalizando al caso donde la propiedad names devuelve una matriz de células de objetos, no necesariamente cadenas, puede probar esta solución que reshapes cada conjunto de células en una matriz de células M-por-1, a continuación, vertically concatenates todos ellos en una matriz de células N-por-1 de objetos:

allNames = cellfun(@(x) {reshape(x.names,[],1)},allData); 
allNames = vertcat(allNames{:}); 

O, si usted prefiere terminar con una serie de células de 1 por N de objetos, se puede hacer esto:

allNames = cellfun(@(x) {reshape(x.names,1,[])},allData); 
allNames = [allNames{:}]; 
+0

Esto es genial si son matrices de cadenas de celdas, pero lamentablemente te he confundido. Son matrices de celdas de objetos personalizados. Aún así, puedo sacarle provecho a este enfoque. ¡Gracias! – PengOne

+1

@PengOne: La moraleja de la historia es "recuerde proporcionar datos de muestra en su pregunta". –

+0

@Richie Cotton: el objeto se define en varios archivos y muchas, muchas líneas, por lo que solo nubla la pregunta que en el fondo es simple: ¿cómo puedo concatenar matrices de celdas que en sí mismas son celdas en una matriz de celdas? – PengOne

1

probar este

allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false) 

omite el vararg UniformOutput para la concatenación recta. Esto da una salida de celda.

+0

La operación '[allData {:}]' solo funcionará si los elementos de la matriz de celdas se pueden concatenar horizontalmente en una matriz de estructura, lo que significaría que no había una razón real para usar una matriz de celdas en primer lugar. – gnovice

+0

@PengOne: tenga en cuenta los [corchetes]. Pero intentaré por una solución más genérica. –

+0

Probé esto ... el resultado es una matriz de celdas de 1x3, cada celda que contiene una de las matrices de celdas que realmente desearía encontraría la manera de concatenarse. – PengOne

Cuestiones relacionadas