All possible combinations of 2 vectors.

2 visualizzazioni (ultimi 30 giorni)
Artyom
Artyom il 22 Nov 2012
Hi everyone.
I have one vector and one number. For example [1 3 5] and 0.
How do I generate all possible combinations? Like this:
0 3 5
1 0 5
1 3 0
0 0 5
0 3 0
1 0 0
0 0 0
  2 Commenti
Matt Fig
Matt Fig il 22 Nov 2012
Why is the last row all zeros? It looks like the rule is: take at least one element from each vector, with repetition allowed only for the shorter vector. But then the last row breaks this. So what is the rule?
Artyom
Artyom il 22 Nov 2012
The rule is:
1) we have an n - dimensional vector.
2) replace one number with zero and find all combinations
3) replace two numbers with zero and find all combinations
4) ...
5) replace n-1 number with zero and find all combinations
6) replace n number with zero

Accedi per commentare.

Risposta accettata

Matt Fig
Matt Fig il 22 Nov 2012
Modificato: Matt Fig il 23 Nov 2012
Here is a solution:
function H = mycomb(V)
% Help
L = length(V);
H = cell(1,L);
for ii = 1:L-1
C = nchoosek(1:L,L-ii);
R = cumsum(ones(size(C)));
M = max(R(:,1));
H{ii} = zeros(M,L);
H{ii}(R+(C-1)*M) = V(C);
end
H{L} = zeros(1,L);
H = vertcat(H{:});
Now try it out from the command line:
>> mycomb([4 5 6])
ans =
4 5 0
4 0 6
0 5 6
4 0 0
0 5 0
0 0 6
0 0 0
>> mycomb([4 5 6 7])
ans =
4 5 6 0
4 5 0 7
4 0 6 7
0 5 6 7
4 5 0 0
4 0 6 0
4 0 0 7
0 5 6 0
0 5 0 7
0 0 6 7
4 0 0 0
0 5 0 0
0 0 6 0
0 0 0 7
0 0 0 0

Più risposte (3)

Andrei Bobrov
Andrei Bobrov il 22 Nov 2012
Modificato: Andrei Bobrov il 22 Nov 2012
variant
t = [1 3 5];
ii = perms([t, zeros(size(t))]);
out = unique(sort(t(:,1:numel(t)),2),'rows');
or
t = [1 3 5];
out = [];
n = numel(t);
for jj = 1:n
k = nchoosek(t,n - jj);
out = [out;[zeros(size(k,1),jj),k]];
end
or
k = ones(1,numel(t)) * 2.^(numel(t)-1:-1:0)';
out = bsxfun(@times,t,dec2bin(0:k - 1,numel(t))-'0');

Azzi Abdelmalek
Azzi Abdelmalek il 22 Nov 2012
Modificato: Azzi Abdelmalek il 23 Nov 2012
save this function
function y=arrangement(v,n)
m=length(v);
y=zeros(m^n,n);
for k = 1:n
y(:,k) = repmat(reshape(repmat(v,m^(n-k),1),m*m^(n-k),1),m^(k-1),1);
end
then type
x=arrangement([1 3 5 0],3)
out=x(~all(x,2),:)
If you don't need repetition add
s=arrayfun(@(t) sort(out(t,:)),(1:size(out,1))','un',0)
out1=unique(cell2mat(s),'rows')

Matt J
Matt J il 23 Nov 2012
Modificato: Matt J il 23 Nov 2012
t=[1 3 5];
n=length(t);
result = bsxfun(@times, [1,3,5], dec2bin(2^n-1:-1:0)-'0')

Community Treasure Hunt

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

Start Hunting!

Translated by