You can create the result like this for the specific case:
firstCol = [ones(9,1);2*ones(9,1);3*ones(9,1)];
secondCol = repeat([ones(3,1);2*ones(3,1);3*ones(3,1)],1,3);
thirdCol = repeat([1;2;3],1,9);
result = [firstCol secondCol thirdCol];
First, repeat 9 times 1,2, and 3 for first column. then repeat each of them 3 times for the second column and choose the third column once for each item. Indeed, this generate the all possible choices for each location.
How? If you suppose the first element is 1, you have 3 choice for the second place, and 3 choice for the third place. Hence, you have 9 possible option when the first place is 1. Also, fix the second place, and analyze this. You can generalize this for 2 and 3. The above code, try to generate possibilities based on this explanation.
In the above, ones
generate a matrix which all elements are 1 with the specified size and repeat
function repeats the specified matrix in the specified size and dimension. You can check the documentation to know more about them.
Hence, You can generalize it for n
like the following:
n = 10;
result = zeros(3^n,3);
for idx = 1:n
result(:,idx) = repeat([ones(3^(n-idx),1);2*ones(3^(n-idx),1);3*ones(3^(n-idx),1)],1,3^(idx-1));
end