Hadamard-Matrices

Annette.Warlich at t-online.de Annette.Warlich at t-online.de
Tue Mar 29 18:07:15 CEST 2005


Hi -

 the method is not completely bounded to small n.

 With partitioniting I could find the following matrices:
 r0: no partitioning
 r1: partitioned in 2^1 partitions
 r2: partitioned in 2^2 partitions
 r3: partitioned in 2^3 partitions

n=4
macroexec r0  //success

n=8
macroexec r0  //success

n=12
macroexec r0  //success

//----------- R1 -----------------------

n=16
macroexec r1 //success

n=20
macroexec r1  //success

n=24
macroexec r1 //success

n=28
macroexec r1  // failed

//----------- R2 -----------------------
n=32
macroexec r2  //success

n=36
macroexec r2  // failed

n=40
macroexec r2  //success

n=44
macroexec r2  // failed

n=48
macroexec r2  //success

n=52
macroexec r2  // failed

n=56
macroexec r2  // failed

n=60
macroexec r2  // failed


//------------------ R3 -----------------
n=64
macroexec r3  //success

n=68
macroexec r3  // failed

n=72
macroexec r3  // failed

n=76
macroexec r3  // failed

n=80
macroexec r3  //success

(This pattern looks familiar)


----------------------------------------------------

The procedures are very simple besides the "canned" -varimax-rotation
of columns.



The most simple  routine is R0


> st = "-varimax"   // set the maximizing-criterion to "varimax-minimizing"
> 
> 
> macrodef r0           // usable for n=4,8,12
> A = sqrt(n)*einh(n)   // multiple of unit-matrix
> B = A
> 
> B = rot(B,st)         // rotation performed on a copy of A
> macroend


With one partitioning it is R1:

> macrodef r1          // for n=16,20,24
> a = sqrt(n)*einh(n)
> b = a 
> 
> // preconditioning the two diagonal blockmatrices 
> r = n/2                       // do a rotation first on the upper left block diagonal
> ba = seq(1,r)                 // create an appropriate index 1..n/2 to partition the work-matrix
> b = rot(b,st,    ba,    ba)   // rotate only on indicated colums using only indicated rows as criterion
> b = rot(b,st,1*r+ba,1*r+ba)   // rotate only on indicated colums using only indicated rows as criterion
> 
> b = rot(b,st)        // now rotate it using all columns
> macroend


This is simply extended to higher n: R2

> macrodef r2          // for n=32,40,48
> a = sqrt(n)*einh(n)
> b = a 
> 
> // preconditioning the four diagonal blockmatrices 
> r = n/4
> ba = seq(1,r)
> b = rot(b,st,    ba,    ba)
> b = rot(b,st,1*r+ba,1*r+ba)
> b = rot(b,st,2*r+ba,2*r+ba)
> b = rot(b,st,3*r+ba,3*r+ba)
> 
> // preconditioning the two diagonal blockmatrices 
> r = r*2
> ba = seq(1,r)
> b = rot(b,st,    ba,    ba)
> b = rot(b,st,1*r+ba,1*r+ba)
> 
> // using the preconditioned complete matrix
> b = rot(b,st)
> macroend

Analoguously this works for R3 with N=64, N=80

But increasing n requires exponential cpu-time, since the
rotation-process is not optimized for this special type
of matrices.

Gottfried Helms








More information about the SeqFan mailing list