cholesky_decomposition.sf 891 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Cholesky_decomposition
  4. #
  5. func cholesky(matrix) {
  6. var chol = matrix.len.of { matrix.len.of(0) }
  7. for row in ^matrix {
  8. for col in (0..row) {
  9. var x = matrix[row][col]
  10. for i in (0..col) {
  11. x -= (chol[row][i] * chol[col][i])
  12. }
  13. chol[row][col] = (row == col ? x.sqrt : x/chol[col][col])
  14. }
  15. }
  16. return chol
  17. }
  18. var example1 = [ [ 25, 15, -5 ],
  19. [ 15, 18, 0 ],
  20. [ -5, 0, 11 ] ];
  21. say "Example 1:";
  22. cholesky(example1).each { |row|
  23. say row.map {'%7.4f' % _}.join(' ');
  24. }
  25. var example2 = [ [ 18, 22, 54, 42],
  26. [ 22, 70, 86, 62],
  27. [ 54, 86, 174, 134],
  28. [ 42, 62, 134, 106] ];
  29. say "\nExample 2:";
  30. cholesky(example2).each { |row|
  31. say row.map {'%7.4f' % _}.join(' ');
  32. }