Cholesky decomposition: Difference between revisions

Rename Perl 6 -> Raku, alphabetize, minor clean-up
(→‎{{header|Groovy}}: new solution)
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 77:
;Note:
# The Cholesky decomposition of a [[Pascal matrix generation‎|Pascal]] upper-triangle matrix is the [[wp:Identity matrix|Identity matrix]] of the same size.
# The Cholesky decomposition of a Pascal symmetric matrix is the Pascal lower-triangle matrix of the same size.
 
 
=={{header|Ada}}==
Line 526 ⟶ 525:
12.72792, 3.04604, 1.64974, 0.00000,
9.89949, 1.62455, 1.84971, 1.39262,
 
 
=={{header|Clojure}}==
Line 720 ⟶ 718:
var c2 := Cholesky(m2);
ShowMatrix(c2);</lang>
 
=={{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|Fantom}}==
Line 784 ⟶ 842:
[[4.242640687119285, 0.0, 0.0, 0.0], [5.185449728701349, 6.565905201197403, 0.0, 0.0], [12.727922061357857, 3.0460384954008553, 1.6497422479090704, 0.0], [9.899494936611667, 1.624553864213788, 1.8497110052313648, 1.3926212476456026]]
</pre>
 
 
=={{header|Fortran}}==
Line 863 ⟶ 920:
-1.0 1.0 3.0
</pre>
 
=={{header|FreeBASIC}}==
{{trans|BBC BASIC}}
Line 940 ⟶ 998:
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}}==
Line 1,705 ⟶ 1,703:
3: (4) [9.899494936611665, 1.6245538642137891, 1.849711005231382, 1.3926212476455924]
</pre>
 
 
=={{header|jq}}==
Line 2,029 ⟶ 2,026:
[ ]
[9.899494934 1.624553864 1.849711006 1.392621248]</lang>
 
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
Line 2,292 ⟶ 2,288:
do k=j+5 to 0 by -1; numeric digits m.k; g=(g+x/g)*.5; end /*k*/
numeric digits d; return (g/1)i /*make complex if X < 0.*/</lang>
 
 
 
=={{header|PARI/GP}}==
Line 2,448 ⟶ 2,442:
9.8995 1.6246 1.8497 1.3926
</pre>
=={{header|Perl 6}}==
{{works with|Rakudo|2015.12}}
<lang perl6>sub cholesky(@A) {
my @L = @A »*» 0;
for ^@A -> $i {
for 0..$i -> $j {
@L[$i][$j] = ($i == $j ?? &sqrt !! 1/@L[$j][$j] * * )(
@A[$i][$j] - [+] (@L[$i;*] Z* @L[$j;*])[^$j]
);
}
}
return @L;
}
.say for cholesky [
[25],
[15, 18],
[-5, 0, 11],
];
 
.say for cholesky [
[18, 22, 54, 42],
[22, 70, 86, 62],
[54, 86, 174, 134],
[42, 62, 134, 106],
];</lang>
 
=={{header|Phix}}==
Line 2,838 ⟶ 2,807:
 
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2015.12}}
<lang perl6>sub cholesky(@A) {
my @L = @A »*» 0;
for ^@A -> $i {
for 0..$i -> $j {
@L[$i][$j] = ($i == $j ?? &sqrt !! 1/@L[$j][$j] * * )(
@A[$i][$j] - [+] (@L[$i;*] Z* @L[$j;*])[^$j]
);
}
}
return @L;
}
.say for cholesky [
[25],
[15, 18],
[-5, 0, 11],
];
 
.say for cholesky [
[18, 22, 54, 42],
[22, 70, 86, 62],
[54, 86, 174, 134],
[42, 62, 134, 106],
];</lang>
 
=={{header|REXX}}==
10,327

edits