-
Notifications
You must be signed in to change notification settings - Fork 14
/
npermutek.m
131 lines (125 loc) · 4.22 KB
/
npermutek.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
function [permutedMatrix, index] = npermutek(N, K)
%NPERMUTEK Permutation of elements with replacement/repetition.
% permutedMatrix = NPERMUTEK(N,K) returns all possible samplings of
% length K from vector N of type: ordered sample with replacement. MAT
% has size (numel(N)^K)-by-K, where K must be a scalar.
% [permutedMatrix, Index] = NPERMUTEK(N,K) also returns Index such that
% permutedMatrix = N(Index). N may be of any numeric class, char, cell,
% struct or custom objects.
%
%
% Syntax: [permutedMatrix, Index] = npermutek(N, K)
%
% Inputs:
% N: The input to be permuted, can be of any numeric
% class, char, cell, struct.
% K: The number of permutations, needs to be
% numeric, scalar, real, positiv.
%
% Outputs:
% permutedMatrix: The permuted Matrix
% index : The indices from the input in the permuted
% Matrix
%
% Examples:
% permutedMatrix = npermutek([2 4 5],2)
%
% permutedMatrix =
%
% 2 2
% 2 4
% 2 5
% 4 2
% 4 4
% 4 5
% 5 2
% 5 4
% 5 5
%
% NPERMUTEK also works on characters.
%
% permutedMatrix = npermutek(['a' 'b' 'c'],2)
% permutedMatrix =
%
% aa
% ab
% ac
% ba
% bb
% bc
% ca
% cb
% cc
%
% NPERMUTEK also works on cells.
%
% aCell = {'a', 2; 'd', {[1 :10]}}
%
% aCell =
%
% 'a' [ 2]
% 'd' {1x1 cell}
%
% permutedMatrix = npermutek(aCell,2)
% permutedMatrix =
%
% 'a' 'a'
% 'a' 'd'
% 'a' [ 2]
% 'a' {1x1 cell}
% 'd' 'a'
% 'd' 'd'
% 'd' [ 2]
% 'd' {1x1 cell}
% [ 2] 'a'
% [ 2] 'd'
% [ 2] [ 2]
% [ 2] {1x1 cell}
% {1x1 cell} 'a'
% {1x1 cell} 'd'
% {1x1 cell} [ 2]
% {1x1 cell} {1x1 cell}
%
% See also: perms, nchoosek
%
%
% About and copyright
% Author: Adrian Etter
% http://www.econ.uzh.ch/faculty/etter.html
% E-Mail: [email protected]
% © Adrian Etter
% Version 1.0 2013/Feb/28
%
% This function is based on the work of Matt Fig's npermutek,
% especially the help and description was just copied out of his script:
% See:
% http://www.mathworks.ch/matlabcentral/fileexchange/11462-npermutek
% Also on the web: http://mathworld.wolfram.com/BallPicking.html See
% the section on Enumerative combinatorics below:
% http://en.wikipedia.org/wiki/Permutations_and_combinations Author:
% Matt Fig Contact: [email protected]
%
assert(nargin == 2, 'NPERMUTEK:nrargin', 'NPERMUTEK requires two arguments. See help.');
% Test K
assert(numel(K) == 1 ...
&& floor(K) == K ...
&& gt(K, 0) ...
&& isreal(K), ...
'NPERMUTEK:K', ...
'Second argument K needs to be real positive and scalar integer. See help.');
% get input matrix
Input = N(:);
nrElements = numel(N);
nrRows = nrElements ^ K;
inputIndices = (1:nrElements).';
index = reshape((1:nrRows * K).', nrRows, K); % allocate space for output
% Create permutation matrix
for iColumn = 1 : K
row = repmat(inputIndices(:,ones(1, nrElements^(iColumn - 1))).', 1, nrElements ^ (K - iColumn));
index(:, iColumn) = row(:);
end
% flip to common format
index = fliplr(index);
% assign output
permutedMatrix = Input(index);
end