How to create an N-ary array

4 views (last 30 days)
David Cyncynates
David Cyncynates on 18 Dec 2020
Answered: Bruno Luong on 19 Dec 2020
Suppose I have K variables, each of which can take the values 1 through N. I want to create a table such that each column corresponds to the Kth variable, and each row corresponds to a particular combination. This table will be N^K entries long and K entries wide. One way to do this would be, for example
[V1 V2 ... VK] = ngrid(1:N,1:N,...,1:N)
V = [V1 V2 ... VK]
However, this clearly does not generalize nicely to variable N. Is there a simple way to extend this code so it works for different K?
  8 Comments
David Cyncynates
David Cyncynates on 18 Dec 2020
Here's an example of what I was trying to write. Perhaps I'll just stick with this:
N = 4;
K = 3;
V = zeros(K,N^K);
ii = 0 : N^K - 1;
for jj = 1 : K
V(jj,:) = floor((mod(ii,N^jj))/N^(jj-1));
end
James Tursa
James Tursa on 18 Dec 2020
Edited: James Tursa on 18 Dec 2020
OK, got it. Looks like you are basically counting in base N with K digits. How large can K and N be? This could easily eat all your memory if they are too large.

Sign in to comment.

Answers (2)

Stephen23
Stephen23 on 18 Dec 2020
Edited: Stephen23 on 19 Dec 2020
N = 4;
K = 3;
C = cell(1,K);
[C{:}] = ndgrid(1:N);
C = cellfun(@(m)m(:),C,'uni',0);
M = [C{:}]
M = 64×3
1 1 1 2 1 1 3 1 1 4 1 1 1 2 1 2 2 1 3 2 1 4 2 1 1 3 1 2 3 1
... lots more rows here not shown
How it works:
As James Tursa pointed out, you could quickly run out of memory for large values of K.

Bruno Luong
Bruno Luong on 19 Dec 2020
N=3
K=5
[~,A] = ismember(dec2base(0:N^K-1,N),['0':'9' 'A':'Z']);
A = A-1

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!