function magicSquare = oddmagic(dim) % ODDMAGIC magic square of of odd numbered dimensions % % a = oddmagic(dim) produces a magic square of dimensions dim. % oddmagic returns an error if dim is an even number. for even numbered % magic squares use evenmagic. the smallest dimension accepted is 3. % % Algorithm developed by Sri. Samavedula Sita Rama Sastry % http://www.me.berkeley.edu/~srinath/magic if ( mod(dim, 2) == 0 ) error('Error: oddmagic only works for odd numbers, try evenmagic for even sided magic squares'); end if ( dim < 3 ) error('Error: Smallest odd sided magic square possible is 3 x 3'); elseif ( dim == 3) magicSquare = magic(3); return; end magicSquare = zeros(dim, dim); lastsmall = (dim^2 - (dim-2)^2)/2; middleoddnum = lastsmall/2 - 1; magicSquare(2:((middleoddnum-1)/2+1),1) = [1:2:(middleoddnum - 2)]'; magicSquare(dim, (dim+1)/2) = middleoddnum; magicSquare((middleoddnum-1)/2+2:dim-1, dim) = [(middleoddnum + 2):2:lastsmall-1]'; magicSquare(dim, 2:((middleoddnum-1)/2+1)) = [2:2:(middleoddnum - 1)]; magicSquare(1, ((middleoddnum-1)/2+3):dim-1) = [(middleoddnum + 1):2:lastsmall-4]; magicSquare(1,1) = lastsmall - 2; magicSquare(1,dim) = lastsmall; outersum = 1+dim^2; for i=2:dim-1 emptyrow = dim; if (magicSquare(1,i) == 0) emptyrow = 1; end magicSquare(emptyrow, i) = outersum - magicSquare(dim-emptyrow+1, i); emptycol = dim; if (magicSquare(i,1) == 0) emptycol = 1; end magicSquare(i, emptycol) = outersum - magicSquare(i, dim-emptycol+1); end magicSquare(dim,1) = outersum - magicSquare(1,dim); magicSquare(dim,dim) = outersum - magicSquare(1,1); magicSquare(2:dim-1, 2:dim-1) = oddmagic(dim-2) + lastsmall;