mirror of
https://github.com/gonum/gonum.git
synced 2025-10-19 05:24:52 +08:00
blas/testblas: add packHermitian and unpackHermitian helper functions
This commit is contained in:

committed by
Vladimír Chalupecký

parent
153d48337f
commit
bbe1b3b1a6
@@ -349,3 +349,62 @@ func max(a, b int) int {
|
|||||||
}
|
}
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// packHermitian returns an n×n Hermitian matrix in packed format stored in
|
||||||
|
// the uplo triangle of the general matrix A.
|
||||||
|
func packHermitian(uplo blas.Uplo, n int, a []complex128, lda int) []complex128 {
|
||||||
|
if n == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ap := make([]complex128, n*(n+1)/2)
|
||||||
|
var ii int
|
||||||
|
if uplo == blas.Upper {
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
for j := i; j < n; j++ {
|
||||||
|
ap[ii] = a[i*lda+j]
|
||||||
|
ii++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
for j := 0; j <= i; j++ {
|
||||||
|
ap[ii] = a[i*lda+j]
|
||||||
|
ii++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ap
|
||||||
|
}
|
||||||
|
|
||||||
|
// unpackHermitian returns an n×n general Hermitian matrix (with stride n)
|
||||||
|
// whose packed uplo triangle is stored on entry in ap.
|
||||||
|
func unpackHermitian(uplo blas.Uplo, n int, ap []complex128) []complex128 {
|
||||||
|
if n == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
a := make([]complex128, n*n)
|
||||||
|
lda := n
|
||||||
|
var ii int
|
||||||
|
if uplo == blas.Upper {
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
for j := i; j < n; j++ {
|
||||||
|
a[i*lda+j] = ap[ii]
|
||||||
|
if i != j {
|
||||||
|
a[j*lda+i] = cmplx.Conj(ap[ii])
|
||||||
|
}
|
||||||
|
ii++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
for j := 0; j <= i; j++ {
|
||||||
|
a[i*lda+j] = ap[ii]
|
||||||
|
if i != j {
|
||||||
|
a[j*lda+i] = cmplx.Conj(ap[ii])
|
||||||
|
}
|
||||||
|
ii++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user