From b045cf83a5bc70d9a8e070604a6eea69aa891ea0 Mon Sep 17 00:00:00 2001 From: Bert Chang Date: Sat, 3 May 2014 22:27:34 +0800 Subject: [PATCH] Add manhattan distance. --- metrics/pairwise/manhattan.go | 27 +++++++++++++++++++++++++++ metrics/pairwise/manhattan_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 metrics/pairwise/manhattan.go create mode 100644 metrics/pairwise/manhattan_test.go diff --git a/metrics/pairwise/manhattan.go b/metrics/pairwise/manhattan.go new file mode 100644 index 0000000..847f05c --- /dev/null +++ b/metrics/pairwise/manhattan.go @@ -0,0 +1,27 @@ +package pairwise + +import ( + "math" + + "github.com/gonum/matrix/mat64" +) + +type Manhattan struct{} + +func NewManhattan() *Manhattan { + return &Manhattan{} +} + +func (self *Manhattan) Distance(vectorX *mat64.Dense, vectorY *mat64.Dense) float64 { + subVector := mat64.NewDense(0, 0, nil) + subVector.Sub(vectorX, vectorY) + + r, _ := subVector.Dims() + + result := .0 + for i := 0; i < r; i++ { + result += math.Abs(subVector.At(i, 0)) + } + + return result +} diff --git a/metrics/pairwise/manhattan_test.go b/metrics/pairwise/manhattan_test.go new file mode 100644 index 0000000..8a62a5c --- /dev/null +++ b/metrics/pairwise/manhattan_test.go @@ -0,0 +1,27 @@ +package pairwise + +import ( + "testing" + + "github.com/gonum/matrix/mat64" + . "github.com/smartystreets/goconvey/convey" +) + +func TestManhattan(t *testing.T) { + manhattan := NewManhattan() + + Convey("Given two vectors", t, func() { + vectorX := mat64.NewDense(3, 1, []float64{2, 2, 3}) + vectorY := mat64.NewDense(3, 1, []float64{1, 4, 5}) + + Convey("When calculating distance", func() { + result := manhattan.Distance(vectorX, vectorY) + + Convey("The result should be 5", func() { + So(result, ShouldEqual, 5) + }) + + }) + + }) +}