github.com/weaviate/weaviate@v1.24.6/modules/ref2vec-centroid/vectorizer/method_mean.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package vectorizer 13 14 import "fmt" 15 16 func calculateMean(refVecs ...[]float32) ([]float32, error) { 17 if len(refVecs) == 0 || len(refVecs[0]) == 0 { 18 return nil, nil 19 } 20 21 targetVecLen := len(refVecs[0]) 22 meanVec := make([]float32, targetVecLen) 23 24 // TODO: is there a more efficient way of doing this? 25 for _, vec := range refVecs { 26 if len(vec) != targetVecLen { 27 return nil, fmt.Errorf("calculate mean: found vectors of different length: %d and %d", 28 targetVecLen, len(vec)) 29 } 30 31 for i, val := range vec { 32 meanVec[i] += val 33 } 34 } 35 36 for i := range meanVec { 37 meanVec[i] /= float32(len(refVecs)) 38 } 39 40 return meanVec, nil 41 }