Wie Elemente (Reihen) eines Cell-Arrays gruppieren?

Gast #2302217
Hallo allerseits,

ich habe ein Cell-Array der folgenden Form (effektiv nur ein Ausschnitt 
um die gewünschte Funktionalität zu verdeutlichen, es können für jede 
Spalte unterschiedlichste Werte auftreten). Die erste Spalte enthält 
eine Matrix, die übrigen Spalten jeweils Strings.

A a c d
B a c e
C a c f
D a c g
E b c h
F a c d
G a c e
H a c f
I a c g
J b c h

Ich möchte die Einträge nun nach den Spalten 2 und 4 gruppiert auslesen, 
d.h. am Ende möchte ich Folgendes haben:


A a c d
F a c d

B a c e
G a c e

C a c f
H a c f

D a c g
I a c g

E b c h
J b c h

Kann mir jemand sagen, wie ich das mit möglichst wenig Aufwand 
hinkriegen kann? Ich bin soweit gekommen, dass ich mir die unique-Werte 
für 'a' ausgeben lasse, aber die Gruppierung nach der vierten Spalte 
kriege ich einfach nicht hin.

Viele Grüße,
Steven
Gast #2346172
Hi ...


ich schätze mal du meinst in matlab oder ? ;-) das Problem ist natürlich 
auf viele Wege zu lösen z.b über forschleifen und aufsteigender 
Indizierung -> jedoch finde ich ist dies mi reshape und einer 3ten 
Dimension am elegantesten ...

1
 
2

3
% create a cellarray with ones
4
s=ones(10,3);arrayfun(@(x) ({x}), s)
5

6
numR=2; % number of rows in subMatrix
7
numC=3; % number of columns subMatrix
8

9
% exMatR is a 3dimensional matrix with your blocks in 3rd dimension
10
exMatR=reshape(exMat,numR,numC,size(exMat,1)/numR);

Dabei ist es natürlich notwendig das die Dimensionen der SubMatrix in 
die Hauptmatrix passen !


lg Peter
Gast #2346177
Oje man sollte genau lesen ... sorry
peter schrieb:
> Hi ...
>
>
> ich schätze mal du meinst in matlab oder ? ;-) das Problem ist natürlich
> auf viele Wege zu lösen z.b über forschleifen und aufsteigender
> Indizierung -> jedoch finde ich ist dies mi reshape und einer 3ten
> Dimension am elegantesten ...
>

>
> lg Peter
Gast #2346228
So jetzt aber ;-)

[code]

% matrix
mat=['Aacd';'Bace';'Cacf';'Dacg';'Ebch';'Facd';'Gace';'Hacf';'Iacg';'Jbc 
h'];
matR=arrayfun(@(x) ({x}), mat); % build a cellarray

% sort 2nd column
[sortVal,sortInd]=sort(matR(:,2));
matR(:,:)=matR(val,:) % reorder matrix due to first sorting
% sort 4nd column
[sortVal1,sortInd2]=sort(matR(:,4));
matR(:,:)=matR(val2,:) % reorder matrix due to second sorting


% create subBlocks
numC=4; % colums of subBlock
numR=2; % rows of subBlock
exMatR=reshape(matR,numR,numC,size(exMat,1)/numR);

[\code]

lg Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.