2017-06-20 30 views
5

Mam strukturę 8x18 z każdym celem zawierającym wektor kolumn wystąpień pojedynczego zdarzenia. Chcę uzyskać dane z niektórych z tych pól połączonych w jedną macierz, bez konieczności przechodzenia przez nie. Nie mogę znaleźć sposobu na pionowe łączenie pól, które mnie interesują, w jednej tablicy.Uzyskiwanie wielu pól struktury w Matlab bez przechodzenia przez nie

Jako przykład mogę utworzyć następującą strukturę z między 1 i 5 wystąpień na komórkę:

s(62).vector(8,18).heading.occurrences=[1;2;3]; 
for i=1:62 
    for j=1:8 
     for k=1:18 
      y=ceil(rand(1)*5); 
      s(i).vector(j,k).heading.occurrences=rand(y,1); 
     end 
    end 
end 

Teraz, jeśli chcemy uzyskać wszystkie wystąpienia w kilku komórkach zachowując i stałym poziomie do chwili i=1 następujące prace:

ss=s(1).vector([1 26 45]);      
h=[ss.heading];    
cell2mat({h.occurrences}') 

teraz chciałbym zrobić to samo dla s na przykład s([1 2 3]).vector([1 26 45]), w jaki sposób to działa? Próbowałem xx=s([1 2 3]), yy=xx.vector([1 26 45]) ale to jednak daje błąd:

Expected one output from a curly brace or dot indexing expression, but there were 3 results.

Czy to również możliwe przy pracy wektorowej?

Odpowiedz

2

Poniżej zwektoryzowany rozwiązanie, które może pomieścić użyciu wektorów indeksu dla s a pole vector:

sIndex = [1 2 3]; % Indices for s 
vIndex = [1 26 45]; % Indices for 'vector' field 

v = reshape(cat(3, s(sIndex).vector), 144, []); 
h = [v(vIndex, :).heading]; 
out = vertcat(h.occurrences); 

wykorzystuje cat aby łączyć wszystkie vector pola na 8-o-18-ubocznych numel(sIndex) macierz, reshapes, która do macierzy 144-na-numel(sIndex), następnie indeksuje wiersze określone przez vIndex i zbiera ich pola heading i occurrences, używając vertcat zamiast cell2mat.

+0

Świetne, dziękuję! – Jasper

0

Trudno wektoryzować całą operację, ale to powinno zadziałać.

% get vector field and store in cell array 
s_new = { s(1:3).vector }; 

% now extract heading field, this is a cell-of-cells 
s_new_heading = cellfun(@(x) { x.heading }', s_new, 'UniformOutput', false); 

occurences = {}; 
for iCell = 1:length(s_new_heading) 
    % use current cell 
    cellHere = s_new_heading{iCell}; 

    % retain indices of interest, these could be different for each cell 
    cellHere = cellHere([ 1 26 45 ]); 

    % extract occurrences 
    h = cellfun(@(x) x.occurrences, cellHere, 'UniformOutput', false); 
    h_mat = cell2mat(h); 

    % save them in cell array 
    occurences = cat(1, occurences, h_mat); 
end