2014-04-13 38 views
0

我想知道,假設我們有有0和2之間的數字的所有可能的組合,例如4列的表,所以這將是Matlab的排列表

 0  0  0  0 
    0  0  0  1 
    0  0  0  2 
    0  0  1  0 
    0  0  1  1 
    0  0  1  2 
    0  0  2  0 
    0  0  2  1 
    0  0  2  2 
    0  1  0  0 
    0  1  0  1 

等含3^4行。

有沒有一種方法可以讓我在可以說第56行的情況下找到組合,而無需構造整個表格,因爲無法爲更大的數字創建類似這樣的表格(例如,值範圍從0到100,使用> 1000列)。

回答

1

這 -

%%// Given data 
rownum = 56; %%// Row number to be found out 
arr1=[0 1 2]; %%// Numbers used for perms 
Nc = 4; %%// Number of columns 

N = numel(arr1);%%// Number of array elements for perms 

%%// Combination needed 
comb1 = arr1(fliplr(ceil(bsxfun(@mod,rownum,power(N,1:Nc))./power(N,0:Nc-1)))) 

輸出 -

comb1 = 

    2  0  0  1 
+0

這是一個很好的解決方案,而不是小至@路易斯 - mendo的人,但在這裏,你可以選擇在最終結果中的列數。 – ealiaj

+1

此外,路易斯提供的解決方案似乎只能上升到base36,並不會讓我們說N = 120。 – ealiaj

+0

@green_leaf是的,我剛剛注意到'dec2base'的限制。至少這個'bsxfun'方法正常工作! – Divakar

2

n的最右邊一列簡單地爲mod(n, 3)
如果您隨後用floor(n./3)替換n,則可以以相同方式檢索下一個最右邊的文件。
沖洗和重複以構建整個行...

2

每個組合是基本-3擴展的數的,從0開始並以3^4-1結束。所以,你可以使用dec2base從這個數字轉換成其擴張:

N = 3; %// number of digits 
M = 4; %// number of columns 
n = 56; %// row number: 1, 2, ..., N^M 

result = dec2base(n-1,N)-'0'; 
+0

+1這很聰明! – Divakar

+0

很棒的建議,我最初的方法是與dec2base,但我不能讓它正常工作。對於如何做相反的事,你有什麼建議嗎?我嘗試了'bi2de(result,N,'left-msb')'但是我得到_55_而不是_56_。 – ealiaj

+0

@green_leaf你必須加1,因爲第一行是[0 0 ... 0],它對應於數字0,但是你(像Matlab一樣)在1開始索引 –