2016-11-17 3 views
1

У меня есть несколько векторов или списков векторов и хотелось бы составить все возможные конкатенации их записей. Вот пример:Все возможные комбинации элементов/векторов/список векторов (декартово произведение)

a1=4; 
a2=[1,6;1,9;6,9]; 
a3=[2;7]; 

Это все должно привести к:

[4,1,6,2] 
[4,1,6,7] 
[4,1,9,2] 
[4,1,9,7] 
[4,6,9,2] 
[4,6,9,7] 

Я думаю, что мой вопрос похож на этот: Generate all possible combinations of the elements of some vectors (Cartesian product) но я на самом деле не в состоянии адаптировать ответы на мою проблему.

EDIT: Еще раз спасибо за ответ и исправления! Как уже сказал стакан, его работы похожи на обаяние в октаве. Теперь я также хотел бы, чтобы он был немного более гибким для произвольного числа a, объединенного в массив ячеек (или любую другую структуру, которая лучше соответствовала бы потенциальному решению). Я работал с составом строки, а затем eval. Но для меня это не очень элегантно. Возможно ли, чтобы он был более ... алгоритмическим?

+0

Вы имеете в виду «6,9» на последних двух выходах? –

+0

@ LuisMendo Очень хорошо сказать «да» ... –

ответ

2

Я отвечаю, используя MATLAB в надежде, что тот же код работает и в Octave.


Вот решение, основанное на Amro's answer в вопросе вы связаны между собой:

a1=4; 
a2=[1,6;1,9;6,9]; 
a3=[2;7]; 

nRows = [size(a1,1), size(a2,1), size(a3,1)]; 

[x,y,z] = ndgrid(1:nRows(1),1:(nRows(2)),1:(nRows(3))); 
cartProd = [a1(x(:),:) a2(y(:),:) a3(z(:),:)]; 

Какие результаты в:

cartProd = 

    4  1  6  2 
    4  1  9  2 
    4  6  9  2 
    4  1  6  7 
    4  1  9  7 
    4  6  9  7 

Это несколько иной порядок, чем то, что вы показали, но я думаю, он все равно может быть вам полезен.

+2

Прекрасно работает в Октаве. :) – beaker

Смежные вопросы