Cholesky decomposition: Difference between revisions

Added solution for F#
m (Undo revision 287019 by Ndts (talk))
(Added solution for F#)
Line 940:
12.72792 3.04604 1.64974 0.00000
9.89949 1.62455 1.84971 1.39262</pre>
 
=={{header|F#}}==
 
<lang fsharp>open Microsoft.FSharp.Collections
 
let cholesky a =
let calc (a: float[,]) (l: float[,]) i j =
let c1 j =
let sum = List.sumBy (fun k -> l.[j, k] ** 2.0) [0..j - 1]
sqrt (a.[j, j] - sum)
let c2 i j =
let sum = List.sumBy (fun k -> l.[i, k] * l.[j, k]) [0..j - 1]
(1.0 / l.[j, j]) * (a.[i, j] - sum)
if j > i then 0.0 else
if i = j
then c1 j
else c2 i j
let l = Array2D.zeroCreate (Array2D.length1 a) (Array2D.length2 a)
Array2D.iteri (fun i j _ -> l.[i, j] <- calc a l i j) l
l
 
let printMat a =
let arrow = (Array2D.length2 a |> float) / 2.0 |> int
let c = cholesky a
for row in 0..(Array2D.length1 a) - 1 do
for col in 0..(Array2D.length2 a) - 1 do
printf "%.5f,\t" a.[row, col]
printf (if arrow = row then "--> \t" else "\t\t")
for col in 0..(Array2D.length2 c) - 1 do
printf "%.5f,\t" c.[row, col]
printfn ""
 
let ex1 = array2D [
[25.0; 15.0; -5.0];
[15.0; 18.0; 0.0];
[-5.0; 0.0; 11.0]]
 
let ex2 = array2D [
[18.0; 22.0; 54.0; 42.0];
[22.0; 70.0; 86.0; 62.0];
[54.0; 86.0; 174.0; 134.0];
[42.0; 62.0; 134.0; 106.0]]
 
printfn "ex1:"
printMat ex1
 
printfn "ex2:"
printMat ex2
</lang>
{{out}}
<pre>ex1:
25.00000, 15.00000, -5.00000, 5.00000, 0.00000, 0.00000,
15.00000, 18.00000, 0.00000, --> 3.00000, 3.00000, 0.00000,
-5.00000, 0.00000, 11.00000, -1.00000, 1.00000, 3.00000,
ex2:
18.00000, 22.00000, 54.00000, 42.00000, 4.24264, 0.00000, 0.00000, 0.00000,
22.00000, 70.00000, 86.00000, 62.00000, 5.18545, 6.56591, 0.00000, 0.00000,
54.00000, 86.00000, 174.00000, 134.00000, --> 12.72792, 3.04604, 1.64974, 0.00000,
42.00000, 62.00000, 134.00000, 106.00000, 9.89949, 1.62455, 1.84971, 1.39262,
</pre>
 
=={{header|Go}}==
Anonymous user