Effacer les filtres
Effacer les filtres

All possible combinations of 2 vectors.

1 vue (au cours des 30 derniers jours)
Artyom
Artyom le 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 commentaires
Matt Fig
Matt Fig le 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 le 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

Connectez-vous pour commenter.

Réponse acceptée

Matt Fig
Matt Fig le 22 Nov 2012
Modifié(e) : Matt Fig le 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

Plus de réponses (3)

Andrei Bobrov
Andrei Bobrov le 22 Nov 2012
Modifié(e) : Andrei Bobrov le 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');
  1 commentaire
Matt Fig
Matt Fig le 23 Nov 2012
Very nice! (The last one)

Connectez-vous pour commenter.


Azzi Abdelmalek
Azzi Abdelmalek le 22 Nov 2012
Modifié(e) : Azzi Abdelmalek le 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 le 23 Nov 2012
Modifié(e) : Matt J le 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