【问题标题】:Generate all possible permutations for 2 vectors为 2 个向量生成所有可能的排列
【发布时间】:2014-07-22 13:51:03
【问题描述】:

我想知道是否有办法为 2 个向量生成所有可能的排列。我知道我可以使用烫发,但这仅适用于一个向量。

我想要的是输入向量 [1 2 3] 并且会出去​​p>

V1 = []      V2 = [1 2 3]
V1 = [1 2 3] V2 = []
V1 = [1]     V2 = [2 3]
V1 = [2]     V2 = [1 3]
...

我也可以将所有这些排列存储在一个单元格数组中,因为它们都有不同的长度,因此矩阵不起作用。

【问题讨论】:

  • 您需要所有排列还是所有可能的除法?那就是你需要[1],[ 2 3 ][1], [ 3 2 ],还是这两者之一就足够了?
  • 是的,我也只需要其中之一。抱歉,我应该澄清一下

标签: matlab permutation


【解决方案1】:

这是你想要的吗?

output = {};
v = [1 2 3];  % input
N = length(v);
for k=1:2^N
    m = logical( bitget(k, 1:N) );  % mask selecting elements of v1
    v1 = v(m);
    v2 = v(~m);
    output{end+1} = {v1, v2};
end

【讨论】:

  • 好吧,对于我的版本 (2014a) bitget 返回双精度,您不能直接用于索引。我编辑了该行以使您的代码更加健壮。奇怪的是它对你有用,你有什么版本?
  • 哈好吧,我在 octave 上,不是 matlab,我的错 :)
  • 啊好吧!有关您答案的矢量化版本,请参阅我的答案的编辑。不要认为它更快,这只是为了好玩;)
  • 非常感谢@thewaywewalk 和 seb。你们真的很有帮助!我也有一个旧版本的 matlab 所以 bitget 返回双打,但笨拙的对我有用。
【解决方案2】:

不过,在几乎一行中,功劳应该归于seb

v = [1 2 3 4]; 
N = numel(v);

out = cellfun(@(x) {v(x) v(~x)}, mat2cell( logical( bsxfun(@bitget,(1:2^N)', (1:N)) ) ,ones(1,2^N),N) , 'uni', 0)

我的旧答案,笨拙,但有效:

A = arrayfun(@(x) nchoosek(V,x), 1:numel(V), 'uni',0);
B = cellfun(@(x) mat2cell(x,ones(1,size(x,1)),size(x,2)),A,'uni',0);

V1 = vertcat({[]},B{:});
V2 = cellfun(@(x) setdiff(V,x), V1, 'uni',0);

给予:

>> celldisp(V1)

V1{1} =
     []
V1{2} =
     1
V1{3} =
     2
V1{4} =
     3
V1{5} =
     1     2
V1{6} =
     1     3
V1{7} =
     2     3
V1{8} =
     1     2     3

V2 正好相反。

【讨论】:

  • 有没有办法扩大规模,以便它可以将一个向量的所有排列也生成 3 个或 4 个向量? @thewaywewalk
  • @AustenNovis 不采用这种方法。
  • 关于如何开始这样的事情的任何提示?
【解决方案3】:

尝试以下解决方案:

a=num2cell(1:3);
output1=cellfun(@(x) nchoosek(1:3,x),a,'UniformOutput',false);
output_reverse=cellfun(@(x) nchoosek(3:-1:1,x),a(2:3),'UniformOutput',false);

对于1,2,3的序列,输出如下:

output1{1}=

     1
     2
     3

output1{2}=

     1     2
     1     3
     2     3

output1{3}=

     1     2     3

仅当您还需要反向组合时才执行output_reverse 行。希望这是您正在寻找的。​​p>

【讨论】:

    【解决方案4】:

    对所有可能的划分使用循环。对于每个划分,计算一个掩码(逻辑索引),它告诉哪些元素去V1,哪些去V2。以下假设顺序不重要,即[1],[2 3][1], [3 2] 是相同的划分。

    vector = [1 2 3]; %// example data
    N = numel(vector); %// number of elements
    NN = 2^N; %// number of results
    V1 = cell(1,NN); %// intiallize
    V2 = cell(1,NN); %// intiallize
    for n = 0:NN-1;
        mask = logical(dec2bin(n,N)-'0'); %// logical index for values in V1
        V1{n+1} = vector(mask);
        V2{n+1} = vector(~mask);
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2023-03-29
      • 2016-09-09
      • 1970-01-01
      相关资源
      最近更新 更多