找到所有集合的组合

Cro*_*ley 1 matlab combinations

假设我们有2 x N形式的矩阵

A=| a1 a2 ... aN |
  | b1 b2 ... bN |
Run Code Online (Sandbox Code Playgroud)

有2 ^ N种组合如何重新排列行.我想找到B包含所有组合的矩阵.

%% N=2
B=|a1 a2|
  |a1 b2|
  |b1 a2|
  |b1 b2|
%% N=3
B=|a1 a2 a3|
  |a1 a2 b3|
  |a1 b2 a3|
  |a1 b2 b3|
  |b1 a2 a3|
  |b1 a2 b3|
  |b1 b2 a3|
  |b1 b2 b3|
Run Code Online (Sandbox Code Playgroud)

这与用于学习布尔代数基础知识的表(ai = 0,bi = 1)非常相似.

这个问题可能会扩展到创建M^N x N矩阵M x N.

Lui*_*ndo 5

试试这个:

A = [10 20 30; 40 50 60]; %// data matrix
[m, n] = size(A); %// m: number of rows; n: number of cols
t = dec2bin(0:2^n-1)-'0'; %// generate all possible patterns
t = bsxfun(@plus, t, 1:m:n*m-1); %// convert to linear index
result = A(t); %// index into A to get result
Run Code Online (Sandbox Code Playgroud)

它给:

result =
    10    20    30
    10    20    60
    10    50    30
    10    50    60
    40    20    30
    40    20    60
    40    50    30
    40    50    60
Run Code Online (Sandbox Code Playgroud)

编辑 @Crowley:

扩大回答最后一个注释: dec2bin功能更改为dec2base基地m(在下面的例子中,我们想从三个选项中的每一列中选择)和n列.

A = [10 20;...
     40 50;...
     70 80]; %// data matrix
[m, n] = size(A); %// m: number of rows; n: number of cols
t = dec2base(0:m^n-1,m,n)-'0'; %// generate all possible patterns
t = bsxfun(@plus, t, 1:m:n*m-1); %// convert to linear index
result = A(t) %// index into A to get result
Run Code Online (Sandbox Code Playgroud)

这给出了:

result =

    10    20
    10    50
    10    80
    40    20
    40    50
    40    80
    70    20
    70    50
    70    80
Run Code Online (Sandbox Code Playgroud)