Ci sono tanti metodi possibili.
Alcuni esempi:
[*]
il più semplice: usare la funzione "unique" specificando il parametro "rows" nella chiamata e tre parametri di output (fai riferimento alla documentazione per i dettagli)
[*]
il più "facile": due loop annidati che confrontino la prima riga con tutte le altre, poi la seconda con le rimanenti e così via. Due righe con "0" e "1" sono uguali se la somma dei valori assoluti delle differenze tra gli elementi delle righe è uguale a 0. Questo metodo può essere utile nel caso si voglia fare pratica con il loop e la manipolazione degli indici della matrici
[*]
il più bizzarro: convertire la sequenza di "0" e "1" delle righe n numeri binari e poi in numeri decimali per ottenere un vettore; quindi usare la funzione "unique" per trovare gli elementi "unici" del vettore
%
% Generate the input matrix
%
n_col=10;
n_sub_mat=5;
s1=randi([0 1],1,n_col);
s2=randi([0 1],1,n_col);
s3=randi([0 1],1,n_col);
m1=[repmat(s1,randi([1 n_sub_mat],1,1),1); ...
repmat(s2,randi([1 n_sub_mat],1,1),1); ...
repmat(s3,randi([1 n_sub_mat],1,1),1)];
m=m1(randperm(size(m1,1)),:);
%
% Two nested loops solution
%
tic
% Initialize the index array
idx=nan(1,size(m,1));
% Loop over the rows of the input matrix
idx(1)=1;
for i=1:size(m,1)-1
if(isnan(idx(i)) || i == 1)
idx(i)=i;
else
continue
end
for j=i+1:size(m,1)
% Two row are identical if the sum of the absolute value of the difference
% between the component is 0
d=sum(abs(m(i,1:end-1)-m(j,1:end-1)));
if(d == 0 && isnan(idx(j)))
% Store in the index array the number of the row matching
idx(j)=i;
end
end
end
% Check for the case the last row is unique
if(isnan(idx(end)))
idx(end)=max(idx)+1;
end
% Find the unique indices of the rows
uni=unique(idx);
toc
% Store in a cell array:
% the row indices of the input matrix that are equal
% the corresponding row
% the number of the rows
for i=1:length(uni)
x{i,1}=find(idx == uni(i));
% x{i,2}=m(x{i,1},:);
x{i,2}=m(x{i,1}(1),:);
x{i,3}=length(x{i,1});
end
%%%%%%%%%%%%%%
tic
%
% Simpliest method with built-in function
%
% Find the uniques rows
%
[a,b,c]=unique(m,'rows');
toc
% Store in a cell array:
% the row indices of the input matrix that are equal
% the corresponding row
% the number of the rows
for i=1:length(b)
x2{i,1}=find(c == c(i));
% x2{i,2}=m(x2{i,1},:);
x2{i,2}=m(x2{i,1}(1),:);
x2{i,3}=length(x2{i,1});
end
%%%%%%%%%%%%%%
%
% A bizarre method
%
tic
% COnvert the input matrix in a matrix of strings
% Interpret the matrix of strings as a matrix of binary numbers
% Convert them into an array of decimal numbers
idx1=bin2dec(num2str(m))';
% Find the uniques decimal numbers
uni1=unique(idx1);
toc
% Store in a cell array:
% the row indices of the input matrix that are equal
% the corresponding row
% the number of the rows
for i=1:length(uni1)
x1{i,1}=find(idx1 == uni1(i));
% x1{i,2}=m(x1{i,1},:);
x1{i,2}=m(x1{i,1}(1),:);
x1{i,3}=length(x1{i,1});
end