# (Mathe-) Vektoren in Scala



## dmike (29. Jan 2010)

Also es geht um die mathematischen Vektoren nicht um die Collection Vector.

Ich würde gerne den Downhill-Simplex Algorithmus (von Nealder / Mead) zur Übung in Scala implementieren. Dazu brauch ich die üblichen Vektoroperationen wie Vektoraddition, Skalarmultiplikation etc. Kann ich den in Scala diese Operationen so mathematisch wie möglich ausdrücken?

Z.B. so

(1,2)+(3,4)

(1.5,2.5)+( -1*(3,4.5))

(1.5,1) * 2.0

0.5*(2,3)

Geht das?


----------



## Landei (30. Jan 2010)

Theoretisch könntest du über implizite Funktionen Tupel mißbrauchen, um diese Syntax zu erlauben. Ich würde trotzdem besser (und performanter) eine einfache Vektorklasse als case class schreiben, dann könntest du v(1,2,3) und so schreiben.


----------



## dmike (1. Feb 2010)

Landei hat gesagt.:


> Theoretisch könntest du über implizite Funktionen Tupel mißbrauchen, um diese Syntax zu erlauben. Ich würde trotzdem besser (und performanter) eine einfache Vektorklasse als case class schreiben, dann könntest du v(1,2,3) und so schreiben.



Nur aus Neugier... liegt das etwa daran, dass runde Klammern für Tupel verwendet werden? Könnte ich z.B. [] nehmen, also [1.5,1.5]+[1.5,1.5] schreiben?


----------



## Landei (1. Feb 2010)

Eckige Klammern in Scala sind für Typparameter (Generics) reserviert. Ganz ehrlich, du wirst keine wirklich mathematische Schreibweise hinbekommen. Die Scala-Syntax ist zwar flexibel, aber so flexibel nun wieder auch nicht. Zur Zeit könnten das höchstens Sprachen, die Macros in geeigneter Form erlauben (etwa C++), oder Exotensprachen, die Syntaxmodifikationen zur Laufzeit zulassen (da fällt mir nur Seed7 ein). Was spricht gegen:

```
case class v(data:Double*) {
   def +(that: v) = if (this.data.size != that.data.size) error ("different length") else 
      v(this.data.zip(that.data).map(t => t._1 + t._2): _*)
   override def toString = data.mkString("[",",","]")
}

println(v(1,2,5.5) + v(7,6,5))
//--> [8.0,8.0,10.5]
```


----------



## dmike (13. Feb 2010)

danke ich hab jetzt auch auf der Scala Homepage ein Beispiel gefunden.


----------

