Conjugate transpose: Difference between revisions

Content added Content deleted
(Added Ada)
m (→‎{{header|Tcl}}: Tweak layout for readability)
Line 348: Line 348:
<lang tcl>package require struct::matrix
<lang tcl>package require struct::matrix
package require math::complexnumbers
package require math::complexnumbers

proc conjugateTranspose {matrix} {
set mat [struct::matrix]
$mat = $matrix
$mat transpose
for {set c 0} {$c < [$mat columns]} {incr c} {
for {set r 0} {$r < [$mat rows]} {incr r} {
set val [$mat get cell $c $r]
$mat set cell $c $r [math::complexnumbers::conj $val]
}
}
return $mat
}


proc complexMatrix.equal {m1 m2 {epsilon 1e-14}} {
proc complexMatrix.equal {m1 m2 {epsilon 1e-14}} {
Line 378: Line 365:
}
}
return 1
return 1
}

proc isHermitian {matrix {epsilon 1e-14}} {
if {[$matrix rows] != [$matrix columns]} {
# Must be square!
return 0
}
set cc [conjugateTranspose $matrix]
set result [complexMatrix.equal $matrix $cc $epsilon]
$cc destroy
return $result
}
}


Line 413: Line 389:
}
}
return $c
return $c
}

proc complexMatrix.conjugateTranspose {matrix} {
set mat [struct::matrix]
$mat = $matrix
$mat transpose
for {set c 0} {$c < [$mat columns]} {incr c} {
for {set r 0} {$r < [$mat rows]} {incr r} {
set val [$mat get cell $c $r]
$mat set cell $c $r [math::complexnumbers::conj $val]
}
}
return $mat
}</lang>
Using these tools to test for the properties described in the task:
<lang tcl>proc isHermitian {matrix {epsilon 1e-14}} {
if {[$matrix rows] != [$matrix columns]} {
# Must be square!
return 0
}
set cc [complexMatrix.conjugateTranspose $matrix]
set result [complexMatrix.equal $matrix $cc $epsilon]
$cc destroy
return $result
}
}


Line 420: Line 420:
return 0
return 0
}
}
set mh [conjugateTranspose $matrix]
set mh [complexMatrix.conjugateTranspose $matrix]
set mhm [complexMatrix.multiply $mh $matrix]
set mhm [complexMatrix.multiply $mh $matrix]
set mmh [complexMatrix.multiply $matrix $mh]
set mmh [complexMatrix.multiply $matrix $mh]
Line 435: Line 435:
return 0
return 0
}
}
set mh [conjugateTranspose $matrix]
set mh [complexMatrix.conjugateTranspose $matrix]
set mhm [complexMatrix.multiply $mh $matrix]
set mhm [complexMatrix.multiply $mh $matrix]
set mmh [complexMatrix.multiply $matrix $mh]
set mmh [complexMatrix.multiply $matrix $mh]