# Latin Square

7 views (last 30 days)

Show older comments

I am trying to create a matlab function that returns the number of latin squares for a given size n (where n is around 5). I would like to do this simply by checking all matricies of size n (where the matrix is filled with number 1-n). I am hoping to make it more efficient later but this is my start but i am stuck at trying to figure out how to get matlab to change the matrix by one number. for example, starting with a matrix

M = [3 3 3; 3 3 3; 3 3 3] checking to see if its a Latin square, then checking the next matrix

M = [3 3 3; 3 3 3; 3 3 2]

then

M = [3 3 3; 3 3 3; 3 3 2]

then

M = [3 3 3; 3 3 3; 3 3 1]

then

M = [3 3 3; 3 3 3; 3 2 3]

...

I can do this if i assume a value for n, but without this assumption i cant figure it out. If i knew n, i could just do 9 for loops, but if n were 4 for example, the code would need to be changed to have 16 for loops.

Any help would be greatly appreciated.

Thankyou

##### 1 Comment

Xin Niu
on 25 Sep 2018

Edited: Xin Niu
on 13 Sep 2020

Hi, I also had similar questions and finally figured out an answer. Here is my code:

If you use for loop to fill the numbers, the problem is that the codes are different for even and odd input N. And it's more efficient to use circshift function. Also, in most cases we may prefer to create a latin square with interleaved orders which has better order balance like this:

CreateLatinSquare(5)

ans =

1 2 5 3 4

2 3 1 4 5

3 4 2 5 1

4 5 3 1 2

5 1 4 2 3

(note that in all the rows, the case 3 before 4 and 4 before 3 are balanced)

### Answers (4)

Jan
on 15 Aug 2011

You actually look for a method to create combinations with repetitions. There are some functions in the FEX for this task - I assume this one is the fastest: FEX: VChooseKRO, but you need a C-compiler to install it. FEX: Combinator is an efficient method in pure Matlab.

Another method would be the direct approach:

ready = false;

k = ones(1, n*n);

jj = n*n;

while not(ready)

<here do the check for the vector k>

j = jj;

k(j) = k(j) + 1;

while k(j) > n

k(j) = 1;

j = j - 1;

if j == 0

ready = true;

break;

end

k(j) = k(j) + 1;

end

end

Walter Roberson
on 15 Aug 2011

Image Analyst
on 16 Aug 2011

### See Also

### Categories

### Products

### Community Treasure Hunt

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

Start Hunting!