2016-10-10 15 views
0

ich eine Matrix wie dieses:Matlab Anzahl Zeilen enthalten gleiche Elemente in Matrix

A = [1 2 3 
    3 4 5 
    6 8 7 
    7 9 11 
    12 13 15 
    17 18 19 
]; 

Wie kann ich Zeilen zählen, die gleiche Element enthalten? In diesem Fall ergibt sich 4: Zeile 1 und Zeile 2 enthalten 3; Zeile 3 und Zeile 4 enthalten 7. Danke ...

+0

Nein, die Bedingungen, die ich nicht zulässt, haben – 8727

+0

Wenn Sie keine Duplikate in einer einzelnen Zeile haben können, wie Sie sagen, und jede Zeile darf nur doppelte Werte mit einer anderen Zeile haben: '2 * (number (A) - numel (unique (A)))' ? –

+0

Vielen Dank ... – 8727

Antwort

1
A = [1 2 3 
3 4 5 
6 8 7 
7 9 11 
12 13 15 
17 18 19 
] 
B = unique(A) 
L = length(B) 
Z = [] 
R = 0 
for t=1:L 
    [C,D] = ismember(A,B(t)) 
    SS = sum(sum(D)) 
    if(SS>1) 
    Z(end+1) = B(t) 
    R = R + nnz(sum(D,2)) 
    end 
end 

am Ende dessen wird der Vektor Z alle wiederholten Werte enthalten R wird die Gesamtzahl der wiederholten Reihen geben

Dies wurde ziemlich grob gemacht. aber mit ein wenig Aufwand können Sie diesen Code zu verbessern, indem die Schleife irgendwie beseitigen ....

Hoffe, es hilft

+0

Vielen Dank Freund .. – 8727

+0

Hey Phoenix kleiner Tipp: Wenn Sie 'sum (Summe (2Dmatrix))' verwenden, können Sie auch 'sum (2Dmatrix (:))' verwenden. Es ist eine allgemeinere Art, eine Matrix entlang aller Dimensionen zu summieren. – obchardon

+0

@obchardon Vielen Dank! Ich habe nie an diesen Trick gedacht. Es wird meine zukünftigen Codes ein bisschen besser machen! Vor allem, wenn Sie sich der Dimension der Matrix nicht sicher sind – PhoenixBlue

1

Eine Lösung, die nicht wirklich optimiert, aber es wird funktionieren, wenn Ihre Matrix nicht so groß ist.

A = [1 2 3; 
    3 4 5; 
    6 8 7; 
    7 9 11; 
    12 13 15; 
    17 18 19]; 

for ii = 1:size(A,1) 
    B = A; 
    B(ii,:) = []; 
    ind(ii,:) = sum(ismember(unique(A(ii,:)),unique(B)))>0; %check if there is a common value for the row ii. 
end 

nbrrow = sum(ind) %number of row that contain a similar value. 
+0

Vielen Dank ... – 8727

0

Hier ist eine schnelle Art und Weise, die für einen Wert in mehr als zwei Reihen zu wiederholen (aber nicht in der gleichen Zeile) auch robust ist:

[~,~,ci] = unique(A); 
u = accumarray(ci,1); 
row_count = sum(u(u>1)) 
Verwandte Themen