2014-04-13 2 views
0
궁금

, 이제 우리가 그렇게 3^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 

및 될 것이라고 0과 2 사이의 숫자의 가능한 모든 조합을 가지고 예를 들어, 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

또한 Luis가 제공하는 솔루션은 base36까지 올라갈 수 있으며 N = 120이라고 할 수는 없습니다. – ealiaj

+0

@green_leaf 네, 방금'dec2base '로 그 한계를 발견했습니다. 적어도이'bsxfun' 접근법은 올바르게 작동합니다! – Divakar

2

n의 맨 오른쪽 열은 간단히 mod(n, 3)입니다.
nfloor(n./3)으로 바꾼 경우 동일한 방식으로 다음 오른쪽 끝을 검색 할 수 있습니다.
린스 전체 행을 구성하는 반복 ...

2

각 조합은 0부터 시작하여, 다수의베이스 -3- 확장이며 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')'를 시도했지만 _56_ 대신 _55_을 얻는다. – ealiaj

+0

@green_leaf 첫 번째 행이 [0 0 ... 0]이고 숫자 0에 해당하기 때문에 1을 추가해야하지만 (Matlab처럼) 1에서 색인 생성을 시작합니다 –