2013-10-22 85 views
2

在Wolfram Mathematica中,有一個稱爲Permutationshttp://reference.wolfram.com/mathematica/ref/Permutations.html)的函數。它可以給出包含正好n個元素的所有排列組合。Matlab中的排列函數

例如:Permutations[{1,2,3,4}, {2}]

{{1, 2}, {1, 3}, {1, 4}, {2, 1}, {2, 3}, {2, 4}, {3, 1}, {3, 2}, {3, 4}, {4, 1}, {4, 2}, {4, 3}}

我知道Matlab的功能相似perms,但只接受一個參數,並給出了所有可能的排列。是否有像Mathematica的Permutations[list,{n}]的其他功能?

+1

http://www.mathworks.se/help/stats/combnk.html – rodion

+2

FEX上有一個:http://www.mathworks.com/matlabcentral/fileexchange/11462-npermutek/ – Dan

回答

2

如果順序無關緊要,請看nchoosek

如果它(這似乎是這種情況),有一個低效的,醜陋的,但非工具箱依賴的一行:

>> unique(builtin('_paren', perms(1:4), :,1:2), 'rows') 
ans = 
     1  2 
     1  3 
     1  4 
     2  1 
     2  3 
     2  4 
     3  1 
     3  2 
     3  4 
     4  1 
     4  2 
     4  3 

(這是真的a hacked two-liner)。

我建議你只需使用統計工具箱中的combnk

+0

+1但我建議你添加2行的等效值以及易讀性。 – Dan

2

您可以使用nchoosek獲得所需大小的所有組合,然後使用perms對它們進行排列。這意味着從向量長度k的排列v可以使用

A=nchoosek(v,k); 
P=reshape(A(:,perms(1:k)), [], k); 

注意的P行不會進行排序,你可以使用sortrows對它進行排序:

P=sortrows(reshape(A(:,perms(1:k)), [], k)); 

使用你的例子

v = 1:4; 
k = 2; 
A=nchoosek(v,k); 
P=sortrows(reshape(A(:,perms(1:k)), [], k)) 

回報:

P = 
    1  2 
    1  3 
    1  4 
    2  1 
    2  3 
    2  4 
    3  1 
    3  2 
    3  4 
    4  1 
    4  2 
    4  3