Ich muss die Matrix (gespeichert als ein Array von Arrays) mit einigen Werten füllen. Die Matrix ist ein Jacobi für eine einfache Diffusion Problem und sieht wie folgt aus:Verschachteltes "if" (AKA "Schalter") in Smalltalk (Pharo)
J(1,1) = 1, J(N,N)=0
und für 1<n<N
:
J(n,n) = -2k/dx^2 - 2*c(n)
J(n,n-1)=J(n,n+1) = k/dx^2
der Rest der Matrix Einträge Nullen sind.
Bisher habe ich diese Ungeheuerlichkeit:
(1 to: c size) collect: [ :n |
(1 to: c size) collect: [ :m |
n = 1 | (n = c size)
ifTrue: [ m = n ifTrue: [ 1.0 ] ifFalse: [ 0.0 ] ]
ifFalse: [ m = n
ifTrue: [ -2.0 * k/dx squared - (2.0 * (c at: n)) ]
ifFalse: [ m = (n-1) | (m = (n+1))
ifTrue: [ k/dx squared ]
ifFalse: [ 0.0 ] ] ]
] ]
Beachten Sie die verschachtelte "if-Statements" (Smalltalk-Äquivalente). Das funktioniert. Aber gibt es vielleicht eine elegantere Art, dasselbe zu tun? So wie es jetzt aussieht, ist es eher unlesbar.
Für Nicht-Spielzeug Probleme möchten Sie vielleicht eine effizientere (Sparse) Matrix-Implementierung dafür verwenden. –
@StephanEggermont Sicher genug, für eine ernstere Aufgabe musste ich eine spärliche (banded) Matrix implementieren: Geschwindigkeitsleistung x2 - x3. – mobiuseng