1 // Copyright ©2014 The Gonum Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
8 "gonum.org/v1/gonum/blas"
9 "gonum.org/v1/gonum/blas/blas64"
10 "gonum.org/v1/gonum/internal/asm/f64"
13 // Inner computes the generalized inner product
15 // between column vectors x and y with matrix A. This is only a true inner product if
16 // A is symmetric positive definite, though the operation works for any matrix A.
18 // Inner panics if x.Len != m or y.Len != n when A is an m x n matrix.
19 func Inner(x Vector, a Matrix, y Vector) float64 {
33 switch a := a.(type) {
35 amat := a.RawSymmetric()
36 if amat.Uplo != blas.Upper {
37 // Panic as a string not a mat.Error.
40 var xmat, ymat blas64.Vector
41 if xrv, ok := x.(RawVectorer); ok {
42 xmat = xrv.RawVector()
46 if yrv, ok := y.(RawVectorer); ok {
47 ymat = yrv.RawVector()
51 for i := 0; i < x.Len(); i++ {
55 sum += xi * f64.DotUnitary(
56 amat.Data[i*amat.Stride+i:i*amat.Stride+n],
60 sum += xi * f64.DotInc(
61 amat.Data[i*amat.Stride+i:i*amat.Stride+n],
62 ymat.Data[i*ymat.Inc:], uintptr(n-i),
69 if i != n-1 && yi != 0 {
71 sum += yi * f64.DotUnitary(
72 amat.Data[i*amat.Stride+i+1:i*amat.Stride+n],
76 sum += yi * f64.DotInc(
77 amat.Data[i*amat.Stride+i+1:i*amat.Stride+n],
78 xmat.Data[(i+1)*xmat.Inc:], uintptr(n-i-1),
88 var ymat blas64.Vector
89 if yrv, ok := y.(RawVectorer); ok {
90 ymat = yrv.RawVector()
94 for i := 0; i < x.Len(); i++ {
98 sum += xi * f64.DotUnitary(
99 amat.Data[i*amat.Stride:i*amat.Stride+n],
103 sum += xi * f64.DotInc(
104 amat.Data[i*amat.Stride:i*amat.Stride+n],
105 ymat.Data, uintptr(n),
106 1, uintptr(ymat.Inc),
114 for i := 0; i < x.Len(); i++ {
116 for j := 0; j < y.Len(); j++ {
117 sum += xi * a.At(i, j) * y.AtVec(j)