2017-06-20 5 views
5

I Eine 8x18-Struktur mit jeder Zelle, die einen Spaltenvektor mit dem Auftreten eines einzelnen Ereignisses enthält. Ich möchte Daten von einigen dieser Felder erhalten, die in einem einzigen Array verkettet sind, ohne dass ich sie durchlaufen muss. Ich kann keinen Weg finden, die Felder, an denen ich interessiert bin, in einem einzigen Array vertikal zu verketten.Auf mehrere Strukturfelder in Matlab zugreifen, ohne sie zu durchlaufen

Als Beispiel ich die folgende Struktur mit zwischen 1 und 5 Vorkommen pro Zelle erstellen:

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 

Nun, wenn alle Vorkommen in mehrere Zellen erhalten möchten, während i konstant für den sofortigen i=1 folgende Arbeiten zu halten:

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

Jetzt für s([1 2 3]).vector([1 26 45]) Beispiel für s, das gleiche tun ich möchte, würde, wie das funktioniert? Ich habe xx=s([1 2 3]) versucht, yy=xx.vector([1 26 45]) aber dies ergibt jedoch den Fehler:

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

Ist das auch möglich, mit einer Vektoroperation?

Antwort

2

Hier ist eine vektorisierte Lösung, die vector aufnimmt Verwendung Indexvektoren für s und dem Bereich: Es

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); 

verwendet cat alle vector Felder in eine 8-zu-18-by- numel(sIndex) verketten Matrix, reshapes die in eine 144-by-numel(sIndex)-Matrix, indiziert dann die von vIndex angegebenen Zeilen und sammelt ihre heading- und occurrences-Felder unter Verwendung von vertcat anstelle von cell2mat.

+0

Brilliant, danke! – Jasper

0

Es ist schwierig, die gesamte Operation zu vektorisieren, aber das sollte funktionieren.

% 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 
Verwandte Themen