how to remove repeating rows from a matrix?(there is a case)

1 view (last 30 days)
I want to combine all the possible no-repeating permutations of two or more 0,1 row vectors, for example, there are a=[1,0], b=[1,1,0], the combination of all their possible no-repeating permutations will be
0 1 0 1 1
0 1 1 0 1
0 1 1 1 0
1 0 0 1 1
1 0 1 0 1
1 0 1 1 0
I use the following script to ahieve this,
a=[1,0];
b=[1,1,0];
A=perms(a); %all the possible permutations, may contain repeating rows
B=perms(b);
[r_a,c_a]=size(A);
[r_b,c_b]=size(B);
AB=[];
for i=1:r_a
for j=1:r_b
COM1=[A(i,:) B(j,:)]; %combine ith rows in A with all rows in B
D1(j,1:c_a+c_b)=COM1;
end
AB=cat(1,AB,D1); %update AB on every ith loop
end
AB=unique(AB,'rows'); %delete repeating rows
% AB=union(AB,AB,'rows'); %union can also be used to delete repeating rows
but,in my real case, there are
a=[1,1,0,0,0];
b=[1,1,1,1,0,0];
c=[1,1,1,1,0,0,0];
d=[1,1,1,0,0];
e=[1,1,0,0];
I want to combine all the the possible no-repeating permutations(the result will be ABCDE), using method like the above script,
A=perms(a);
B=perms(b);
C=perms(c);
D=perms(d);
E=perms(e);
and then,
Step 1, combine A and B, delete repeating rows, and result in AB;
Step 2, combine AB and C, delete repeating rows, and result in ABC;
Step 3, combine ABC and D, delete repeating rows, and result in ABCD;
Step 4, combine ABCD and E, delete repeating rows, and result in ABCDE;
but using my method(either using "union" or "unique" to delete), when it comes to Step 4, it is out of memory,
Elapsed time is 1.452821 seconds.%Step 1 Elapsed time is 19.556511 seconds.%Step 2 Elapsed time is 456.368700 seconds.%Step 3 ??? Out of memory. Type HELP MEMORY for your options.
Error in ==> unique at 201 d = b(1:rows-1,:)~=b(2:rows,:);
Error in ==> combine_perms_5 at 85 ABCDE=unique(ABCDE,'rows');%here, I use unique
my questions are,
Q1 Are there simple ways to combine all the possible no-repeating permutations of a,b,c,d,e?
Q2 Are there simple ways to delete repeating rows, making sure that it is not out of memory?
I really appreciate your comment on this!

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 13 Oct 2011
A = perms([0 0 1 1 1]);
AB=unique(A(sum(A(:,1:2),2)==1 | sum(A(:,3:end),2)==2,:),'rows');
variant
a=[1,1,0,0,0];
b=[1,1,1,1,0,0];
c=[1,1,1,1,0,0,0];
d=[1,1,1,0,0];
e=[1,1,0,0];
Din = {a b c d e};
d = cellfun(@(x)unique(perms(x),'rows'),Din,'un',0);
ns = cellfun('size',d,1);
inarg = arrayfun(@(i1)1:i1,ns,'un',0);
M = cell(1,numel(Din));
[M{:}] = ndgrid(inarg{:});
outc = cellfun(@(x,y)x(y(:),:),d,M,'un',0);
out = [outc{:}];
solution on my computer (HP Compaq dx2400 Microtower IntelC2D 2.13GHz, RAM 2GB)
  1 Comment
Zhang
Zhang on 13 Oct 2011
It works, thx indeed! another question, I run the script and the result variable "out" in workspace is an 315000*27 double variable, but "Min"and "Max" shows"Too many elements", I run max(out) and min(out), it shows,
>> max(out)
ans =
Columns 1 through 11
1 1 1 1 1 1 1 1 1 1 1
Columns 12 through 22
1 1 1 1 1 1 1 1 1 1 1
Columns 23 through 27
1 1 1 1 1
>> min(out)
ans =
Columns 1 through 11
0 0 0 0 0 0 0 0 0 0 0
Columns 12 through 22
0 0 0 0 0 0 0 0 0 0 0
Columns 23 through 27
0 0 0 0 0
how can it be all 1 or all 0 in "out"?

Sign in to comment.

More Answers (0)

Categories

Find more on Desktop in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!