Xiao-Yong Jin wrote:
Tomas Andersson <[EMAIL PROTECTED]> writes:

You can never go wrong with a good old fashioned hand written tail recursion when you're in doubt, they are pretty much the closest thing to for-loops there is in haskell and should be easy to grok for Imperative programmers and usually produce really fast code.

sum vect = let d = dim vect
           in sum' (d - 1) 0
  where sum' 0 s = s + (vect @> 0)
        sum' index s = sum' (index - 1) (s + (vect @> index))


Do I need the strict version of sum'?  Put something like

sum' a b | a `seq` b `seq` False = undefined

Or ghc will optimize it automatically?  I always don't know
when such optimization is useful.


I don't know the hmatrix api very well, but if there is a function for computing the inner product between two vectors you could always do something like the following meta code:

sum v = innerProduct v <1,1,1,1,1,1>

I just doubt the efficiency here.  If v is a very large
vector, I guess the allocation time of that intermediate
vector [1,1..] is not small.  But it is just my guess.

My experience is that Haskell allocation time is very fast and usually negligible in most non trivial matrix computations.

A good thing about

sum v = constant 1 (dim v) <.> v

is that a constant vector is efficiently created internally (not from an intermediate Haskell list), and the inner product will be computed by the possibly optimized blas version available in your machine.

You can also write simple definitions like the next one for the average of the rows of a matrix as a simple vector-matrix product:

mean m = w <> m
    where w = constant k r
          r = rows m
          k = 1 / fromIntegral r

I prefer high level "index free" matrix operations to C-like code. Definitions are clearer, have less bugs, and are also more efficient if you use optimized numerical libs.

In any case, many algorithms can be solved by the recursive approach described by Tomas.

Alberto


Xiao-Yong
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to