2017-11-22 5 views
2

Ich habe eine 128x100-Matrix genannt R.Speichern von Vektoren in eine Zellenanordnung

Ich habe eine weitere 1x100 Matrix I. Werte im Vektor genannt I 1 bis 64 reichen.

z.B. I: [13,22,55,63 ..., 35]

Es gibt eine Eins-zu-Eins-Entsprechung zwischen den Elementen von R und I.

ich für jeden eindeutigen Wert von mir wissen will, , dh wenn 1 in sechs Positionen (Spalte # 12, 20, 35, 62, 87, 95) in Vektor I auftritt, wie werden die entsprechenden Spalten (Spalte # 12, 20, 35, 62, 87, 95) in R verknüpft und speichern Sie die Informationen in einem einzelnen Zellenfeld S für alle solche Werte von 1-64.

Ich habe versucht, aber bin nicht in der Lage, an einen kompakten und korrekten Code zu denken.

for j = 1:64 
    for i = 1:100 
     if I(i) == j 
      S{j} = R(:,i); 
     end  
    end  
end 

Antwort

4

Eine Lösung accumarray Verwendung:

S = accumarray(I(:),1:100,[64 1],@(x){R(:,x)}); 

Wenn Array I d oesn't enthält alle Werte von 1:64 S werden leere Zellen, die auf diese Weise entfernt werden können:

S(cellfun(@isempty,S))=[]; 

* Vielen Dank für Vorschlag @LuisMendo die Antwort zu verbessern.

+1

Sehr schöne Verwendung von 'accumarray'. Wenn die leeren Zellen gesucht werden, ist es besser, 'S = akkumarray (I (:), 1: 100, [64 1], @ (x) {R (:, x)})' zu verwenden, so dass leere Zellen am Ende sind nicht getrimmt –

+0

Vielen Dank. Es ist ein kompakter Code und es funktioniert. Ich brauche auch die leeren Zellen. Danke noch einmal! –

+0

@Alastair_V Antwort aktualisiert, um leere Zellen am Ende zu berücksichtigen. – rahnema1

1

Dies macht, was Tou wollen:

S = arrayfun(@(n) R(:,I==n), 1:64, 'UniformOutput', false); 

Oder mit einer äquivalenten Schleife:

S = cell(1,64); 
for n = 1:64 
    S{n} = R(:,I==n); 
end 
+0

Danke. Es ist eine kompakte Lösung. Die äquivalente Schleife hilft auch. –

Verwandte Themen