I would like to propose another idea that has some conceptual similarities to erfan . In my idea are used, namely GetMD5 Representation FEX .
The main task is to โreduceโ each line in A to one representative value (for example, a character vector), and then find unique entries for this vector.
Judging by the standard in comparison with other sentences, my answer does not work as well as one of the alternatives, but I think its meaning is that it is completely data type agnostic (within GetMD5 1 restriction), that the algorithm is very easy to understand, this is a replacement replacement because it works on A and that the resulting array is exactly equal to the one that was obtained by the original method. Of course, this requires the compiler to work and have the risk of hash collisions (which can affect the result in VERY VERY rare cases).
The following are the results of a typical run on my computer, followed by the code:
Original method timing: 8.764601s Dev-iL method timing: 0.053672s erfan method timing: 0.481716s rahnema1 method timing: 0.009771s
function q39955559 G=[0 -1 1; 0 -1 2; 0 -1 3; 0 -1 4; 0 -1 5; 1 -1 6; 1 0 6; 1 1 6; 2 -1 6; 2 0 6; 2 1 6; 3 -1 6; 3 0 6; 3 1 6]; h=7; M=reshape(G(nchoosek(1:size(G,1),h),:),[],h,size(G,2)); A=cell(size(M,1),2); for p=1:size(M,1) A{p,1}=squeeze(M(p,:,:)); left=~ismember(G, A{p,1}, 'rows'); A{p,2}=G(left,:); end %% Benchmark: tic A1 = orig_sort(A); fprintf(1,'Original method timing:\t\t%fs\n',toc); tic A2 = hash_sort(A); fprintf(1,'Dev-iL' method timing:\t\t%fs\n',toc); tic A3 = erfan_sort(A); fprintf(1,'erfan' method timing:\t\t%fs\n',toc); tic A4 = rahnema1_sort(G,h); fprintf(1,'rahnema1' method timing:\t%fs\n',toc); assert(isequal(A1,A2)) assert(isequal(A1,A3)) assert(isequal(numel(A1),numel(A4))) % This is the best test I could come up with... function out = hash_sort(A) % Hash the contents: A_hashed = cellfun(@GetMD5,A,'UniformOutput',false); % Sort hashes of each row: A_hashed_sorted = A_hashed; for ind1 = 1:size(A_hashed,1) A_hashed_sorted(ind1,:) = sort(A_hashed(ind1,:)); end A_hashed_sorted = cellstr(cell2mat(A_hashed_sorted)); % Find unique rows: [~,ia,~] = unique(A_hashed_sorted,'stable'); % Extract relevant rows of A: out = A(ia,:); function A = orig_sort(A) %To find equivalent rows up to order I use a double loop (VERY slow). indices=[]; for j=1:size(A,1) if ismember(j,indices)==0 %if we have not already identified j as a duplicate for i=1:size(A,1) if i~=j if (isequal(A{j,1},A{i,1}) || isequal(A{j,1},A{i,2}))... &&... (isequal(A{j,2},A{i,1}) || isequal(A{j,2},A{i,2}))... indices=[indices;i]; end end end end end A(indices,:)=[]; function C = erfan_sort(A) STR = cellfun(@(x) num2str((x(:)).'), A, 'UniformOutput', false); [~, ~, id] = unique(STR); IC = sort(reshape(id, [], size(STR, 2)), 2); [~, col] = unique(IC, 'rows'); C = A(sort(col), :); % 'sort' makes the outputs exactly the same. function A1 = rahnema1_sort(G,h) idx = nchoosek(1:size(G,1),h); %concatenate complements M = [G(idx(1:size(idx,1)/2,:),:), G(idx(end:-1:size(idx,1)/2+1,:),:)]; %convert to cell so A1 is unique rows of A A1 = mat2cell(M,repmat(h,size(idx,1)/2,1),repmat(size(G,2),2,1));
1 . If you need to create hashes of more complex data types, you can use the DataHash View FEX , which is slightly slower.