2016-08-22 4 views
0

В настоящее время я работаю над PROJEC, где у меня есть массив, и я полагаю, сделать 2х2 перестановку со всеми элементами без использования массива у меня есть что-то вроде этого:2x2 массива Перестановка в Matlab, без петли

A = [ 1 , 3 , 5 , 7] 

, и я хочу получить что-то вроде этого

1 1 
1 3 
1 5 
1 7 
3 1 
3 3 
3 5 
3 7 
5 1 
5 3 
5 5 
5 7 
7 1 
7 3 
7 5 
7 7 

Я бы также интересно получить функцию, где я могу выбрать, если число может переставляться с собой (яйцо: нет 77 66 55) или если заказ (яйцо: 5 3 равно 3 5, поэтому только при вводе)

ответ

2

Если вы хотите иметь повторяющиеся комбинации (где порядок имеет значение) используйте perms и возьмите unique строк для первых двух столбцов.

Пример:

A = [ 1 , 3 , 5 , 7] 
R = perms(A) 
unique(R(:,1:2), 'rows') 

ans = 

1  3 
1  5 
1  7 
3  1 
3  5 
3  7 
5  1 
5  3 
5  7 
7  1 
7  3 
7  5 

Однако, если вы хотите по-настоящему уникальные комбинации, использовать combnk

Пример:

A = [ 1 , 3 , 5 , 7] 
combnk(A, 2) % all combinations using 2 elements 

ans = 

5  7 
3  7 
3  5 
1  7 
1  5 
1  3 
3

Вы можете легко сделать это с meshgrid

[x,y] = meshgrid(A, A); 
out = [x(:), y(:)]; 

% 1  1 
% 1  3 
% 1  5 
% 1  7 
% 3  1 
% 3  3 
% 3  5 
% 3  7 
% 5  1 
% 5  3 
% 5  5 
% 5  7 
% 7  1 
% 7  3 
% 7  5 
% 7  7 

Вы можете удалить само-матчи (т.е. 5 5, 7 7 и т.д.)

out(out(:,1) == out(:,2),:) = [] 

% 1  3 
% 1  5 
% 1  7 
% 3  1 
% 3  5 
% 3  7 
% 5  1 
% 5  3 
% 5  7 
% 7  1 
% 7  3 
% 7  5 

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

out = unique(sort(out, 2), 'rows') 

% 1  3 
% 1  5 
% 1  7 
% 3  5 
% 3  7 
% 5  7 
Смежные вопросы