From: Marc-Andre Lafortune Date: 2010-12-26T06:30:28+09:00 Subject: [ruby-core:33882] Significant update to the Matrix library Hello and Merry Xmas! I'd like to pre-announce a significant update to the matrix library. The update will include matrix decompositions (Eigendecomposition, LUP, QR, ...), add another 10 new methods to Matrix (diagonal?, orthogonal?, permutation?, ...) and allow easy iteration over a subset of the matrix (below/above/on the diagonal). Note that the decompositions are not quite finished yet. They are ported from JAMA (http://math.nist.gov/javanumerics/jama/ ) and need to be cleaned and refactored. I will do this only after the corresponding specs are finished. I have basic specs for Eigendecomposition and LUP decomposition. The current version can be found on my github repos: Code: https://github.com/marcandre/ruby/commits/dec Specs: https://github.com/marcandre/rubyspec/commits/dec I would appreciate comments on the following points: 1) It can be helpful to iterate only on elements above, below or on the diagonal. As this is not completely trivial, I am adding iterators to do so. A possibility would be to add new methods, say `diagonal`, `upper`..., as well as `diagonal_with_index`, ... Another way is to add an optional argument to `each` and `each_with_index` to restrict to a particular subset of elements. I prefer this way, as the wanted subset is independent of the way one wants to iterate (with or without the index, ...). Any argument against? I'll probably open another ticket, but why doesn't Enumerable#all?, none?, etc... accept parameters to forward to #each? 2) Matrix::LUPDecomposition factorizes a matrix into 3 matrices L, U, P, each with special properties. The method #to_a is defined, so that one can write: l, u, p = *Matrix[[42]].lup Should #to_ary also be defined, so the '*' is not needed? It seems like a good idea to me, but the only example I can think of it HTTPRequest which states it is for compatibility only... 3) The decomposition code more than doubles the size of the library. As such I thought it might be a good idea to load the relevant sections only if needed with `autoload`. Any reason not to do this? Thanks -- Marc-Andr�