Files
mmath/vector.nim
2018-12-26 08:14:25 +00:00

72 lines
1.7 KiB
Nim

from oomacro import class
from utils import `...`
from sequtils import newSeqWith
from math import sqrt
type Vector*[T] = seq[T]
#SVector*[S : static[int], T] = array[1..S,T]
proc newVector*[T](size : int, init: T=0) : Vector[T] =
result = newSeq[T](size)
for i in 0...len(result):
result[i] = init
proc `+`*[T](v1 : Vector[T], v2:Vector[T]) : Vector[T] =
result = newVector[T](len(v1))
for i in 0...len(v1):
result[i] = v1[i] + v2[i]
proc `-`*[T](v1 : Vector[T], v2:Vector[T]) : Vector[T] =
result = newVector[T](len(v1))
for i in 0...len(v1):
result[i] = v1[i] - v2[i]
proc `*`*[T](v1 : Vector[T], v2:Vector[T]) : T =
result = 0
for i in 0...len(v1):
result += v1[i] * v2[i]
proc `+=`*[T](v1 : var Vector[T], v2 : Vector[T]) =
for i in 0...len(v1):
v1[i] += v2[i]
proc `-=`*[T](v1 : var Vector[T], v2 : Vector[T]) =
for i in 0...len(v1):
v1[i] -= v2[i]
proc `+=`*[T](v : var Vector[T], value : T) = v.add(value)
proc createVector*[T](elems : varargs[T]) : Vector[T] =
result = newSeq[T]()
for elem in items(elems):
result += elem
proc norm*[T](v : Vector[T]) : T =
for value in v:
result += v * v
proc abs*[T](v : Vector[T]) : T =
return math.sqrt(v.norm)
# let vec = createVector(10,1)
# echo $vec
# var vec2 = newVector[int](10, 1)
# echo vec2
# type Foo[T, S] = object of RootObj
# data : S
# proc `+`[T,S](v1 : Foo[T,S], v2 : Foo[T,S]) : Foo[T,S] =
# result = Foo[T,S]()
# for i in range(len(v1.data)):
# result[i] = v1.data[i] + v2.data[i]
# type Bar[T] = Foo[T, array[3,T]]
# var bar = Bar[int]()
# bar.data[1] = 4
# bar.data[1] = 4