RosettaCodeData/Task/Cholesky-decomposition/Smalltalk/cholesky-decomposition.st
2015-02-20 00:35:01 -05:00

22 lines
614 B
Smalltalk

FloatMatrix>>#cholesky
| l |
l := FloatMatrix zero: numRows.
1 to: numRows do: [:i |
1 to: i do: [:k | | rowSum lkk factor aki partialSum |
i = k
ifTrue: [
rowSum := (1 to: k - 1) sum: [:j | | lkj |
lkj := l at: j @ k.
lkj squared].
lkk := (self at: k @ k) - rowSum.
lkk := lkk sqrt.
l at: k @ k put: lkk]
ifFalse: [
factor := l at: k @ k.
aki := self at: k @ i.
partialSum := (1 to: k - 1) sum: [:j | | ljk lji |
lji := l at: j @ i.
ljk := l at: j @ k.
lji * ljk].
l at: k @ i put: aki - partialSum * factor reciprocal]]].
^l