2009-11-18 3 views
4

J'ai un tableau de structure contenant des champs sous forme de tableaux de structure de longueur variable. Par exemple:MATLAB: Déterminer la longueur/taille totale d'un tableau de structure avec des champs en tant que tableaux de structure

« s » est une structure « données » est un domaine dans l « », et aussi un tableau de structure elle-même et

length(s(n).data) ~= length(s(m).data) 

Je veux preallocate un tableau qui prend un temps tampon de chaque champ à l'adresse. Y at-il un moyen de le faire sans utiliser une boucle for deux fois? Voilà ce que j'ai jusqu'à présent:

% find the total length 
count=0; 
for x=1:length(s) 
    count=count+length(s(x).data); 
end 
% preallocate timestamp array 
timestamp=zeros(1,count); 
% populate timestamp array 
index=1; 
for x=1:length(s) 
    for y=1:length(s(x).data) 
     timestamp(index)=s(x).data(y).timestamp; 
     index=index+1; 
    end 
end 

Je pensais à juste surestimant la longueur que je besoin en fonction de la longueur de « s » et une longueur moyenne des « données », mais la longueur réelle de chaque ' Le champ/sous-structure des données varie considérablement. Serais-je mieux de simplement surestimer le diable et couper le tableau résultant par la suite? Les horodatages à zéro sont impossibles avec l'ensemble de données avec lequel je travaille, cela ne devrait donc pas poser de problème.

Répondre

6

Cela fonctionnera si tous les tableaux de la structure data a les mêmes champs et sont des vecteurs de ligne (c.-à-1 par N):

allData = [s.data];    %# Concatenate all data arrays into one 
timestamp = [allData.timestamp]; %# Collect all the time stamps 

Si les tableaux de structure data sont des vecteurs colonne (c.-à-N -Par-1), vous devez utiliser à la place vertcat:

allData = vertcat(s.data);  %# Concatenate all data arrays into one 
timestamp = [allData.timestamp]; %# Collect all the time stamps 

les solutions ci-dessus fonctionnent en raison du fait que l'accès à un seul champ d'un tableau de structure renvoie comma-separated list.

+1

Wow! Seulement deux lignes - je crois que le terme «génie fous» peut s'appliquer ici. – Doresoom

+0

@doresoom: Les listes séparées par des virgules sont vos amis. ;) – gnovice

Questions connexes