2016-05-04 11 views
0

Ich habe ein Array in MatlabSpeichern von Blöcken von Vektordaten in ein Array in Matlab

A = [1 2 3 4 5 6 7 8 9; 
    67 67 67 86 86 86 86 67 67]'; 

wo jeder Punkt in der ersten Zeile von A auf einen "Code" entspricht entweder 67 oder 86. Ich versuche, diese Blöcke von "67s" und "86s" so zu extrahieren, dass jedes Mal, wenn ein Block beginnt, die entsprechenden Elemente in die dritte Dimension eines anderen Arrays mit dem Namen X gebracht werden, wo der.

Also für z.B. in A Ich habe 3 verschiedene Blöcke, also würde ich gerne mit einem Array X der Größe 1x9x3 enden. Und für z.B. der erste 67 Block würde Ich mag X

X(1,:,1) = [1 2 3]; 

Ich verstehe haben, dass ich dieser Vektor X mit einem for-Schleife

for i=1:size(A,2) 
    for j=1:size(A,2) %actually j should be up till the number of blocks present 
    X(1,i,j) = A(1,i) 
    end 
end 

würde „tanken“ Aber das ist nicht richtig oder vollständig natürlich weil ich erstens unsicher bin, wie man die "Blöcke" trennt und wie man die js in X (1, ​​i, j) richtig ausfüllt. Zweitens, wie kann ich den Code erkennen, wie viele Blöcke es gibt?

Kann jemand helfen?

Dank

+0

Sind Sie sicher, dass Ihr Beispiel Daten korrekt sind? Wie Sie es haben, haben Sie 4 Einträge für '86'. – Suever

+0

@Suever ja, die Blöcke sind nicht gleich groß! –

+1

Wenn in Ihrem Beispiel 'X'' 1x9x3' ist, dann sollte 'X (1,:, 1)' ein Array mit 9 Elementen sein, daher konnte es '[1 2 3]' nicht enthalten. Ich schlage vor, dass Sie Ihr Beispiel überprüfen. –

Antwort

0

Ein möglicher Ansatz, basierend auf this Antwort:

>> B = accumarray([0; cumsum(diff(A(:,2)) ~= 0)] + 1, A(:,1), [], @(x) {x}, []) 

Jetzt haben Sie diese:

>> B{1} 

ans = 

    1 
    2 
    3 

>> B{2} 

ans = 

    4 
    5 
    6 
    7 

>> B{3} 

ans = 

    8 
    9