How to generate all possible vectors where each element can take one of two values

1 visualización (últimos 30 días)
Given vectors a and b both of length N, I want to generate the 2^N vectors for which element i is either a[i] or b[i]. For example, if a=[1,2,3] and b=[4,5,6], then I want to generate
C =
1 2 3
1 2 6
1 5 3
1 5 6
4 2 3
4 2 6
4 5 3
4 5 6
I can do this with the following code
N = length(a);
M = ff2n(N);
Mc = abs(M-1);
C = a.*Mc + b.*M;
but I'm wondering if there is a better way to accomplish this, possibly not requiring ff2n which is not part of standard MATLAB installation? Is there a way to use nchoosek or permute or something like that?

Respuesta aceptada

Paul
Paul el 23 de Jun. de 2022
a = [1 2 3];
b = [4 5 6];
n = numel(a);
C = mat2cell([a; b],2,ones(1,n));
[D{1:n}] = ndgrid(C{:});
E = sortrows(cell2mat(cellfun(@(x) x(:),D,'UniformOutput',false)))
E = 8×3
1 2 3 1 2 6 1 5 3 1 5 6 4 2 3 4 2 6 4 5 3 4 5 6

Más respuestas (1)

Torsten
Torsten el 21 de Jun. de 2022
Generate all possible combinations of 0 and 1:
m = 3;
justRows = dec2bin(0:2^m-1)-'0'
Now replace the 0's by a(i) and the 1 by b(i).
  3 comentarios
Torsten
Torsten el 23 de Jun. de 2022
You can use "allcomb" available here:
a=[1,2,3];
b=[4,5,6];
A = [a;b];
result = allcomb(A(:,1),A(:,2),A(:,3))
Kevin Galloway
Kevin Galloway el 23 de Jun. de 2022
Thanks, Torsten. This is a nice function, and an efficient way of accomplishing my task. Much appreciated!

Iniciar sesión para comentar.

Categorías

Más información sobre Programming en Help Center y File Exchange.

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by