2017-03-22 5 views
0

Ich habe eine große Matrix mit mehreren Zeilen und einer begrenzten (aber größer als 1) Anzahl der Spalten mit Werten zwischen 0 und 9 und würde gerne einen effizienten Weg finden Identifizieren Sie eindeutige zeilenweise Kombinationen und ihre Indizes, um dann Summen zu bilden (etwas wie eine Pivot-Logik). Hier ist ein Beispiel dafür, was ich zu erreichen versuchen:Matlab finde eindeutige Spalten-Kombinationen in Matrix und jeweiligen Index

a = 

1  2  3 
2  2  3 
3  2  1 
1  2  3 
3  2  1 

uniqueCombs = 

1  2  3 
2  2  3 
3  2  1 

numOccurrences = 

2 
1 
2 

indizies: 

[1;4] 
[2] 
[3;5] 

Von Matrix a, mag ich zuerst die einzigartigen Kombinationen (zeilenweise) identifizieren, dann zählen die Anzahl Vorkommen/Identifizierung des Zeilenindex der jeweilige Kombination.

Ich habe dies durch die Generierung von Strings mit num2str und strcat erreicht, aber diese Methode scheint sehr langsam zu sein. Entlang dieser Gedanken habe ich versucht, einen Weg zu finden, eine neue eindeutige Zahl durch Verketten der Werte horizontal zu bilden, aber Matlab scheint dies nicht zu unterstützen (z. B. von [1;2;3] Build 123). Summen funktionieren nicht, da sie die Möglichkeit zur Identifizierung eindeutiger Kombinationen beseitigen würden. Irgendwelche Vorschläge, wie Sie das am besten erreichen können? Vielen Dank!

Antwort

0

Um die eindeutigen Zeilen erhalten Sie unique mit der 'rows' Option aktiviert verwenden können:

[C, ix, ic] = unique(a, 'rows', 'stable'); 

C enthält die eindeutigen Zeilen; ix die Indizes der ersten Vorkommen dieser Zeilen in C; ic enthält grundsätzlich die gewünschten Informationen. Um darauf zuzugreifen Sie Schleife über die Indizes der ix können und sie in einem Zellenfeld speichern:

indexes = cell(1, length(ix)); 
for k = 1:length(ix) 
    indexes{k} = find(ic == ix(k)); 
end 

indexes wird ein Zellenfeld sein, die Indizes enthält, die Sie gesucht haben. Zum Beispiel:

indexes{1} 

% ans = 
% 
% 1 
% 4 

und das Vorkommen einer bestimmten Kombination zählen Sie nur numel nutzen können. Zum Beispiel:

numel(indexes{1}) 

% ans = 
% 
% 2 
+0

funktioniert wie ein Charme, vielen Dank! – Benvaulter

Verwandte Themen