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

2x2 Array Permutation in Matlab with no loop

我目前正在做一个项目,我有一个数组,我想在不使用数组的情况下对所有元素进行 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

我也很想获得一个函数,我可以在其中选择一个数字是否可以自行排列(egg: no 77 66 55)或者顺序是否重要(egg:5 3 等于 3 5,因此仅在条目)

您可以使用 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

如果您想重复组合(顺序很重要),请使用 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