2012-11-02 78 views
1

我想創建載體的獨特排列置換創建布爾值的長度40向量在R中

c(rep(0,20),rep(1,20)) 

但permn在combinat包說:「錯誤向量....矢量指定的大小太大「。

我也嘗試了從this question的腳本uniqueperm2,並得到了一個「向量指定過大」錯誤再次。

在我的理解中,permn會創造40!排列。

我可能通過查找此向量的唯一排列數來解決我正在處理的整體問題。

問題是找到長度爲40的矢量的獨特排列對於R來說太大了,任何人都可以向我解釋如何找出列出的矢量的唯一排列的數量?

回答

0

有(40選擇20)獨特的排列(即選擇0 s的40個職位中的20個,並使用其他20個爲1 s)。這仍然是一個很大的數字,但你可以嘗試combn(40 ,20)

+0

沒有任何R我很熟悉,除了R Devel目前可能的位。 R中最長的矢量長度爲2^31 - 1個元素。 'combn(40,20)'會產生'選擇(40,20)'組合(實際上它會產生一個總長度爲2 *的選擇向量(40,20)',因爲它將結果存儲爲矩陣。遠遠大得不能被R的工具處理。 –

+0

@GavinSimpson:的確如此。我應該計算出實際價值。儘管如此,它只是巨大的。順便說一句,如果R需要整整一秒才能用20個數字做任何有意義的事情,即使考慮到我聽說過R缺乏速度,我也會感到驚訝。如果你可以在微秒內對每個置換做一些有意義的事情 - 就像沒有考慮到這一點 - 那麼你可以在幾天內完成整個過程,而且沒有任何並行化。 (噢,它是0.138 yquan-gillion。fwiw) – rici

+0

@rico謝謝你指出我不能指望。現在修復。至於其他部分;是的,有很多方法可以解決這個問題,並行處理將有所幫助,磁盤存儲選項也是如此。假設一個不重要的計算,我對每個排列的時間保守。 R通常很快;有時候用戶的友好方式會受到影響。 –

2

該向量的每個唯一置換對應於來自{1,2,...,40}的大小20的子集(即,1的索引)。

這些子集的數量是「40選20」,或40! /(20!x 20!)。據谷歌計算器這等於137846528820

+2

解決此問題的R函數:'選擇(40,20)' – Roland

1

正如你已經被告知,排列的數量可以計算爲:

R> choose(40,20) 
[1] 137846528820 

然而,是R目前可處理最長的向量爲2^31 - 1元素長,即:

R> 2^31 - 1 
[1] 2147483647 

這比你想要產生的排列數少。因此,你所得到的錯誤和錯誤你; D得到,如果你試圖與標準功能來生成這些排列combn()

R> combn(40, 20) 
Error in matrix(r, nrow = len.r, ncol = count) : 
    invalid 'ncol' value (too large or NA) 
In addition: Warning message: 
In combn(40, 20) : NAs introduced by coercion 

此時你就必須訴諸編寫代碼來生成排列以類似浴池的方式並研究R上的許多大數據包之一(請參閱High Performance Computing任務視圖)。

或者,這將是我的建議,考慮一下你可能會用1370億美元做些什麼! (美國)排列,然後採取另一種方法。如果你可以每秒處理1次(即花1秒鐘做一些有意義的排列),你仍然可以在4000年的時間內處理結果!

那麼,爲什麼你想要所有的排列?一個較小的隨機集足夠了嗎?

+0

這是一個問題,處理從20x20正方形區域的左上角到右下角的路線數量,無回溯使1單元移動到一次。例如,我想生成路線{1,22,...,441}。但是,由於數量如此之大,我只能瞭解路線數量。 –