A Walsh matrix is a specific square matrix of dimensions 2n, where n is some particular natural number. The elements of the matrix are either +1 or −1 and its rows as well as columns are orthogonal, i.e. dot product is zero. Each row of a Walsh matrix corresponds to a Walsh function.

Walsh matrix is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
This page uses content from Wikipedia. The original article was at Walsh matrix. The list of authors can be seen in the page history. As with Rosetta Code, the text of Wikipedia is available under the GNU FDL. (See links for details on variance)

Walsh matrices are a special case of Hadamard matrices. The naturally ordered Hadamard (Walsh) matrix is defined by the recursive formula below, and the sequency-ordered Hadamard (Walsh) matrix is formed by rearranging the rows so that the number of sign changes in a row is in increasing order.


To generate a naturally ordered Walsh matrix

Matrices of dimension 2k for k ∈ N are given by the recursive formula:

and in general

for 2 ≤ k ∈ N, where ⊗ denotes the Kronecker product.


Task
  • Write a routine that, given a natural number k, returns a naturally ordered Walsh matrix of order 2k.
  • Display a few sample generated matrices.
Traditionally, Walsh matrices use 1 & -1 to denote the different cell values in text mode, or green and red blocks in image mode. You may use whichever display mode is most convenient for your particular language.


Stretch
  • Also, optionally generate sequency ordered Walsh matrices.
A sequency ordered Walsh matrix has the rows sorted by number of sign changes.


See also


F#

// Walsh matrix. Nigel Galloway: August 31st., 2023
open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra
let walsh()=let w2=matrix [[1.0;1.0];[1.0;-1.0]] in Seq.unfold(fun n->Some(n,w2.KroneckerProduct n)) w2
walsh() |> Seq.take 5 |> Seq.iter(fun n->printfn "%s" (n.ToMatrixString()))
Output:
1   1
1  -1

1   1   1   1
1  -1   1  -1
1   1  -1  -1
1  -1  -1   1

1   1   1   1   1   1   1   1
1  -1   1  -1   1  -1   1  -1
1   1  -1  -1   1   1  -1  -1
1  -1  -1   1   1  -1  -1   1
1   1   1   1  -1  -1  -1  -1
1  -1   1  -1  -1   1  -1   1
1   1  -1  -1  -1  -1   1   1
1  -1  -1   1  -1   1   1  -1

 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
 1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1
 1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1
 1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1
 1   1   1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1
 1  -1   1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1
 1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1   1   1
 1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1   1  -1
..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
 1   1   1   1  -1  -1  -1  -1  -1  -1  -1  -1   1   1   1   1
 1  -1   1  -1  -1   1  -1   1  -1   1  -1   1   1  -1   1  -1
 1   1  -1  -1  -1  -1   1   1  -1  -1   1   1   1   1  -1  -1
 1  -1  -1   1  -1   1   1  -1  -1   1   1  -1   1  -1  -1   1

 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1  ..   1   1
 1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  ..   1  -1
 1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1  ..  -1  -1
 1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  ..  -1   1
 1   1   1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1   1  ..  -1  -1
 1  -1   1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1   1  ..  -1   1
 1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1   1   1   1  ..   1   1
 1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1   1  -1   1  ..   1  -1
..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
 1   1   1   1  -1  -1  -1  -1  -1  -1  -1  -1   1   1   1   1  -1  ..  -1  -1
 1  -1   1  -1  -1   1  -1   1  -1   1  -1   1   1  -1   1  -1  -1  ..  -1   1
 1   1  -1  -1  -1  -1   1   1  -1  -1   1   1   1   1  -1  -1  -1  ..   1   1
 1  -1  -1   1  -1   1   1  -1  -1   1   1  -1   1  -1  -1   1  -1  ..   1  -1

Julia

kron is a builtin function in Julia.

julia> const w2 = [1 1; 1 -1]
2×2 Matrix{Int64}:
 1   1
 1  -1

julia> walsh(k) = k < 2 ? w2 : kron(w2, walsh(k - 1))
walsh (generic function with 1 method)

julia> countsignchanges(r) = count(i -> sign(r[i - 1]) != sign(r[i[]]), 2:lastindex(r))
countsignchanges (generic function with 1 method)

julia> sequency(m) = sortslices(m, dims=1, by = countsignchanges)
sequency (generic function with 1 method)

julia>

julia> display(walsh(2))
4×4 Matrix{Int64}:
 1   1   1   1
 1  -1   1  -1
 1   1  -1  -1
 1  -1  -1   1

julia> display(walsh(3))
8×8 Matrix{Int64}:
 1   1   1   1   1   1   1   1
 1  -1   1  -1   1  -1   1  -1
 1   1  -1  -1   1   1  -1  -1
 1  -1  -1   1   1  -1  -1   1
 1   1   1   1  -1  -1  -1  -1
 1  -1   1  -1  -1   1  -1   1
 1   1  -1  -1  -1  -1   1   1
 1  -1  -1   1  -1   1   1  -1

julia> display(walsh(4))
16×16 Matrix{Int64}:
 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
 1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1
 1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1
 1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1
 1   1   1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1
 1  -1   1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1
 1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1   1   1
 1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1   1  -1
 1   1   1   1   1   1   1   1  -1  -1  -1  -1  -1  -1  -1  -1
 1  -1   1  -1   1  -1   1  -1  -1   1  -1   1  -1   1  -1   1
 1   1  -1  -1   1   1  -1  -1  -1  -1   1   1  -1  -1   1   1
 1  -1  -1   1   1  -1  -1   1  -1   1   1  -1  -1   1   1  -1
 1   1   1   1  -1  -1  -1  -1  -1  -1  -1  -1   1   1   1   1
 1  -1   1  -1  -1   1  -1   1  -1   1  -1   1   1  -1   1  -1
 1   1  -1  -1  -1  -1   1   1  -1  -1   1   1   1   1  -1  -1
 1  -1  -1   1  -1   1   1  -1  -1   1   1  -1   1  -1  -1   1

julia> display(sequency(walsh(3)))
8×8 Matrix{Int64}:
 1   1   1   1   1   1   1   1
 1   1   1   1  -1  -1  -1  -1
 1   1  -1  -1  -1  -1   1   1
 1   1  -1  -1   1   1  -1  -1
 1  -1  -1   1   1  -1  -1   1
 1  -1  -1   1  -1   1   1  -1
 1  -1   1  -1  -1   1  -1   1
 1  -1   1  -1   1  -1   1  -1

julia> display(sequency(walsh(4)))
16×16 Matrix{Int64}:
 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
 1   1   1   1   1   1   1   1  -1  -1  -1  -1  -1  -1  -1  -1
 1   1   1   1  -1  -1  -1  -1  -1  -1  -1  -1   1   1   1   1
 1   1   1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1
 1   1  -1  -1  -1  -1   1   1   1   1  -1  -1  -1  -1   1   1
 1   1  -1  -1  -1  -1   1   1  -1  -1   1   1   1   1  -1  -1
 1   1  -1  -1   1   1  -1  -1  -1  -1   1   1  -1  -1   1   1
 1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1
 1  -1  -1   1   1  -1  -1   1   1  -1  -1   1   1  -1  -1   1
 1  -1  -1   1   1  -1  -1   1  -1   1   1  -1  -1   1   1  -1
 1  -1  -1   1  -1   1   1  -1  -1   1   1  -1   1  -1  -1   1
 1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1   1  -1
 1  -1   1  -1  -1   1  -1   1   1  -1   1  -1  -1   1  -1   1
 1  -1   1  -1  -1   1  -1   1  -1   1  -1   1   1  -1   1  -1
 1  -1   1  -1   1  -1   1  -1  -1   1  -1   1  -1   1  -1   1
 1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1   1  -1

Phix

Library: Phix/xpGUI
Library: Phix/online

You can run this online here.

with javascript_semantics
function walsh_matrix(integer n)
    sequence walsh = repeat(repeat(0,n),n)
    walsh[1, 1] = 1
    integer k = 1
    while k < n do
        for i=1 to k do
            for j=1 to k do
                integer wij = walsh[i, j]
                walsh[i+k, j  ] =  wij
                walsh[i  , j+k] =  wij
                walsh[i+k, j+k] = -wij
            end for
        end for
        k *= 2
    end while
    return walsh
end function

function sign_changes(sequence row)
    integer n = length(row)
    return sum(sq_eq(row[1..n-1],sq_mul(row[2..n],-1)))
end function

--/* -- console version:
for natural in {true,false} do
    for order in {2, 4, 5} do
        integer n = power(2,order)
        printf(1,"Walsh matrix - order %d (%d x %d), %s order:\n", {order, n, n, iff(natural?"natural":"sequency")})
        sequence w = walsh_matrix(n)
        if not natural then
            w = extract(w,custom_sort(apply(w,sign_changes),tagset(n)))
        end if
        pp(w,{pp_Nest,1,pp_IntFmt,"%2d",pp_Maxlen,132})
    end for
end for
--*/

include xpGUI.e

integer order = 2, natural = true

procedure redraw(gdx canvas)
    integer {w,h} = gGetAttribute(canvas,"SIZE"),
            mwh = min(w,h), n
    gCanvasRect(canvas,0,w,0,h,true,colour:=XPG_PARCHMENT,fillcolour:=XPG_PARCHMENT)
    while true do
        n = power(2,order)
        if n<=(floor(mwh/4)) then exit end if
        order -= 1
    end while
    string o = iff(natural?"natural":"sequency")
    gSetAttribute(gGetDialog(canvas),"TITLE","Walsh matrix order %d, %s order",{order,o})
    sequence m = walsh_matrix(n)
    if not natural then
        m = extract(m,custom_sort(apply(m,sign_changes),tagset(n)))
    end if
    integer s = floor(mwh/n), xm = floor((w-s*n)/2), ym = floor((h-s*n)/2)
    for i=1 to n do
        for j=1 to n do
            integer mij = m[i,j],
                    c = iff(mij=1?XPG_LIGHT_GREEN:XPG_RED),
                    x = (i-1)*s+xm,
                    y = (j-1)*s+ym
            gCanvasRect(canvas,x,x+s,y,y+s,true,colour:=XPG_BLACK,fillcolour:=c)
        end for
    end for
end procedure

function key_handler(gdx dlg, integer c)
    if c>='1' and c<='7' then
        order = c-'0' -- (may be limited within redraw())
        gRedraw(dlg)
	  return XPG_IGNORE
    elsif lower(c)='s' then
        natural = not natural
        gRedraw(dlg)
    end if
    return XPG_CONTINUE
end function

gdx canvas = gCanvas(redraw),
    dialog = gDialog(canvas,`gCanvas`,`SIZE=370x400`)
gCanvasSetBackground(canvas, XPG_PARCHMENT)
gSetHandler(dialog, `KEY`, key_handler)
gShow(dialog)
gMainLoop()

Raku

sub walsh (\m) { (map {$_?? -1 !! ' 1'}, map { :3(.base: 2) % 2 }, [X+&] ^2**m xx 2 ).batch: 2**m }

sub natural (@row) { Same }

sub sign-changes (@row) { sum (1..^@row).map: { 1 if @row[$_] !== @row[$_ - 1] } }

use SVG;

for &natural, 'natural', &sign-changes, 'sequency' -> &sort, $sort {
    for 2,4,5 -> $order {
        # ASCII text
        .put for "\nWalsh matrix - order $order ({exp($order,2)} x {exp($order,2)}), $sort order:", |walsh($order).sort: &sort;

        # SVG image
        my $side = 600;
        my $scale = $side / 2**$order;
        my $row = 0;
        my @blocks;
        my %C = ' 1' => '#0F0', '-1' => '#F00';

        for walsh($order).sort: &sort -> @row {
            my \x = $row++ * $scale;
            for @row.kv {
                my \y = $^k * $scale;
                @blocks.push: (:rect[:x(x),:y(y),:width($scale),:height($scale),:fill(%C{$^v})]);
            }
        }

        "walsh-matrix--order-{$order}--{$sort}-sort-order--raku.svg".IO.spurt:
          SVG.serialize(:svg[:width($side),:height($side),:stroke<black>,:stroke-width<1>,|@blocks])
    }
}
Output:
Walsh matrix - order 2 (4 x 4), natural order:
 1  1  1  1
 1 -1  1 -1
 1  1 -1 -1
 1 -1 -1  1

Walsh matrix - order 4 (16 x 16), natural order:
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1
 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1
 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1
 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1
 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1
 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1
 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1
 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1
 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1
 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1
 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1
 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1
 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1
 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1
 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1

Walsh matrix - order 5 (32 x 32), natural order:
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1
 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1
 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1
 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1
 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1
 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1
 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1
 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1
 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1
 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1
 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1
 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1
 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1
 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1
 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1
 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1
 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1
 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1
 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1
 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1
 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1
 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1
 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1
 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1
 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1
 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1
 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1
 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1
 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1

Walsh matrix - order 2 (4 x 4), sequency order:
 1  1  1  1
 1  1 -1 -1
 1 -1 -1  1
 1 -1  1 -1

Walsh matrix - order 4 (16 x 16), sequency order:
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1
 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1
 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1
 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1
 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1
 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1
 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1
 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1
 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1
 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1
 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1
 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1
 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1
 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1
 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1

Walsh matrix - order 5 (32 x 32), sequency order:
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1
 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1
 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1
 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1
 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1
 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1
 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1
 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1
 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1
 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1
 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1
 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1
 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1
 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1
 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1
 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1
 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1
 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1
 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1
 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1
 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1
 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1
 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1
 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1
 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1
 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1
 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1
 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1
 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1
Natural order Sequency order
File:Walsh-matrix--order-2--natural-sort-order--raku.svg
File:Walsh-matrix--order-2--sign-changes-sort-order--raku.svg
File:Walsh-matrix--order-4--natural-sort-order--raku.svg
File:Walsh-matrix--order-4--sign-changes-sort-order--raku.svg
File:Walsh-matrix--order-5--natural-sort-order--raku.svg
File:Walsh-matrix--order-5--sign-changes-sort-order--raku.svg

Wren

Library: Wren-matrix
Library: Wren-fmt

Wren-cli

Text mode version.

import "./matrix" for Matrix
import "./fmt" for Fmt

var walshMatrix = Fn.new { |n|
    var walsh = Matrix.new(n, n, 0)
    walsh[0, 0] = 1
    var k = 1
    while (k < n) {
        for (i in 0...k) {
            for (j in 0...k) {
                walsh[i+k, j]   =  walsh[i, j]
                walsh[i, j+k]   =  walsh[i, j]
                walsh[i+k, j+k] = -walsh[i, j]
            }
        }
        k = k + k
    }
    return walsh
}

var signChanges = Fn.new { |row|
    var n = row.count
    var sc = 0
    for (i in 1...n) {
        if (row[i-1] == -row[i]) sc = sc + 1
    }
    return sc
}

var walshCache = {} // to avoid calculating the Walsh matrix twice

for (order in [2, 4, 5]) {
    var n = 1 << order
    Fmt.print("Walsh matrix - order $d ($d x $d), natural order:", order, n, n)
    var w = walshMatrix.call(n)
    walshCache[order] = w
    Fmt.mprint(w, 2, 0, "|", true)
    System.print()
}

for (order in [2, 4, 5]) {
    var n = 1 << order
    Fmt.print("Walsh matrix - order $d ($d x $d), sequency order:", order, n, n)
    var rows = walshCache[order].toList
    rows.sort { |r1, r2| signChanges.call(r1) < signChanges.call(r2) }
    Fmt.mprint(rows, 2, 0, "|", true)
    System.print()
}
Output:
Walsh matrix - order 2 (4 x 4), natural order:
| 1  1  1  1|
| 1 -1  1 -1|
| 1  1 -1 -1|
| 1 -1 -1  1|

Walsh matrix - order 4 (16 x 16), natural order:
| 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1|
| 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1|
| 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1|
| 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1|
| 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1|
| 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1|
| 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1|
| 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1|
| 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1|
| 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1|
| 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1|
| 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1|
| 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1|
| 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1|
| 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1|
| 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1|

Walsh matrix - order 5 (32 x 32), natural order:
| 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1|
| 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1|
| 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1|
| 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1|
| 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1|
| 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1|
| 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1|
| 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1|
| 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1|
| 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1|
| 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1|
| 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1|
| 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1|
| 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1|
| 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1|
| 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1|
| 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1|
| 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1|
| 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1|
| 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1|
| 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1|
| 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1|
| 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1|
| 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1|
| 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1|
| 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1|
| 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1|
| 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1|
| 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1|
| 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1|
| 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1|
| 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1|

Walsh matrix - order 2 (4 x 4), sequency order:
| 1  1  1  1|
| 1  1 -1 -1|
| 1 -1 -1  1|
| 1 -1  1 -1|

Walsh matrix - order 4 (16 x 16), sequency order:
| 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1|
| 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1|
| 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1|
| 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1|
| 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1|
| 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1|
| 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1|
| 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1|
| 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1|
| 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1|
| 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1|
| 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1|
| 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1|
| 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1|
| 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1|
| 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1|

Walsh matrix - order 5 (32 x 32), sequency order:
| 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1|
| 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1|
| 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1|
| 1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1|
| 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1|
| 1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1  1  1  1  1 -1 -1 -1 -1|
| 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1|
| 1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1|
| 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1|
| 1  1 -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1|
| 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1|
| 1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1|
| 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1|
| 1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1  1  1 -1 -1  1  1 -1 -1|
| 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1|
| 1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1|
| 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1|
| 1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1|
| 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1|
| 1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1|
| 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1|
| 1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1  1 -1 -1  1 -1  1  1 -1|
| 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1|
| 1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1|
| 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1|
| 1 -1  1 -1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1|
| 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1|
| 1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1|
| 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1|
| 1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1  1 -1  1 -1  1 -1  1 -1|
| 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1|
| 1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1  1 -1|

DOME

Library: DOME
Library: Wren-polygon

Image mode version.

import "dome" for Window
import "input" for Keyboard
import "graphics" for Canvas, Color
import "./matrix" for Matrix
import "./polygon" for Square

var walshMatrix = Fn.new { |n|
    var walsh = Matrix.new(n, n, 0)
    walsh[0, 0] = 1
    var k = 1
    while (k < n) {
        for (i in 0...k) {
            for (j in 0...k) {
                walsh[i+k, j]   =  walsh[i, j]
                walsh[i, j+k]   =  walsh[i, j]
                walsh[i+k, j+k] = -walsh[i, j]
            }
        }
        k = k + k
    }
    return walsh
}

var signChanges = Fn.new { |row|
    var n = row.count
    var sc = 0
    for (i in 1...n) {
        if (row[i-1] == -row[i]) sc = sc + 1
    }
    return sc
}

var WalshNaturalCache = {}
var WalshSequencyCache = {}

for (order in [2, 4, 5]) {
    var n = 1 << order
    var w = walshMatrix.call(n).toList
    WalshNaturalCache[order] = w
}

for (order in [2, 4, 5]) {
    var rows = WalshNaturalCache[order].toList
    rows.sort { |r1, r2| signChanges.call(r1) < signChanges.call(r2) }
    WalshSequencyCache[order] = rows
}

class WalshMatrix {
    construct new() {
        Window.title = "Walsh Matrix"
        Window.resize(1020, 750)
        Canvas.resize(1020, 750)
        var bc = Color.black
        for (natural in [true, false]) {
            if (natural) {
                Canvas.print("NATURAL ORDERING", 450, 10, Color.blue)
            } else {
                Canvas.print("SEQUENCY ORDERING", 450, 400, Color.blue)
            }
            var z = 10
            for (order in [2, 4, 5]) {
                var y = natural ? 30 : 420
                var mat = natural ? WalshNaturalCache[order] : WalshSequencyCache[order]
                var n = 1 << order
                var size = 320 / n
                for (row in mat) {
                    var x = z
                    for (i in row) {
                        var fc = (i == 1) ? Color.green : Color.red
                        var sq = Square.new(x, y, size)
                        sq.drawfill(fc, bc)
                        x = x + size
                    }
                    y = y + size
                }
                z = z + 340
            }
        }
    }

    init() {}

    update() {}

    draw(alpha) {}
}

var Game = WalshMatrix.new()
File:Wren Walsh matrix.png