(Mathe-) Vektoren in Scala

dmike

Bekanntes Mitglied
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?
 
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.
 
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?
 
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:
Code:
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]
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben