Forum: Digitale Signalverarbeitung / DSP / Machine Learning Wie Elemente (Reihen) eines Cell-Arrays gruppieren?


von Steven (Gast)


Lesenswert?

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

von peter (Gast)


Lesenswert?

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

von peter (Gast)


Lesenswert?

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

von peter (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.