2014-04-13 41 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开始索引 –