Matlab中的2x2数组置换,没有循环

时间:2016-08-22 12:34:50

标签: matlab permutation

我目前正在制作一个项目,我有一个阵列,我想假设在不使用数组的情况下对所有元素进行2x2排列 我有这样的事情:

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 个答案:

答案 0 :(得分: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 57 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

答案 1 :(得分: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