72 lines
1.7 KiB
Nim
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 |