Combinations of different size columns (arrays)

1 visualizzazione (ultimi 30 giorni)
Hi Matlabers,
How can I get the combination of two columns with different sizes? ex: Column one [1;2;3;4;5] Column two [4;5;6;7;8;9;10]
output:
1 4
1 5
1 6
...
5 4
5 6
5 7
5 8
5 9
5 10
Notice the repeating num don't count (5 and 5). thanx in advance

Risposta accettata

Andrei Bobrov
Andrei Bobrov il 14 Set 2012
Modificato: Andrei Bobrov il 17 Set 2012
a = (1:5)';
b = (4:10)';
[i2,i1] = ndgrid(b,a);
out0 = [i1(:),i2(:)];
out = out0(abs(diff(out0,1,2)) > eps(100),:);
or
a = (1:5)';
b = (4:10)';
idx = fullfact([numel(b),numel(a)])
out0 = [a(idx(:,2)),b(idx(:,1))]
out = out0(abs(diff(out0,1,2)) > eps(100),:);
EDIT
a = (1:5)';
b = (4:10)';
c = [15 17 18]';
d = [20 21 22]';
data = {a,b,c,d};
k = cellfun(@numel,data);
idx = fliplr(fullfact(fliplr(k)));
t = cumsum(k);
idx2 = bsxfun(@plus,idx, [0 t(1:end-1)]);
d2 = cat(1,data{:});
out0 = d2(idx2);
out = out0(any(abs(diff(out0,1,2)) > eps(100),2),:);
  2 Commenti
Ahsan Khan
Ahsan Khan il 14 Set 2012
how will this work with more than two arrays. when I add two more arrays (c and d) the output is:
c = [15 17 18];
d = [20 21 22];
[i4,i3,i2,i1,] = ndgrid(d,c,b,a);
out0 = [i1(:),i2(:),i3(:),i4(:)];
out = out0(abs(diff(out0,1,4)) > eps(100),:)
I get: out = Empty matrix: 0-by-4 or maybe I didn't understand the diff function

Accedi per commentare.

Più risposte (1)

Azzi Abdelmalek
Azzi Abdelmalek il 14 Set 2012
x=[4;5;6;7;8;9;10]
n=length(x);
y=repmat(1:9,n);y1=y(:)
x1=repmat(x,n*9,1)
v=[y1 x1]
v(x1-y1==0,:)=[]

Categorie

Scopri di più su Cell Arrays in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by