On 16/05/2010, at 10:17, Pierre-Etienne Meunier wrote:

> I've also just noticed a lack in the vector library : multidimensional arrays 
> seem to require indirections like in caml, whereas in C or in Data.Ix, there 
> is a way to avoid this. This is especially important for avoiding cache 
> misses with many dimensions, as well as for providing a clean interface. For 
> instance if a 10x10 matrix is initialized unproperly like 
> 
> Data.Vector.replicate 10 $ Data.Vector.replicate 10 0
> 
> The result is a total mess. Surely, every programmer knows that a computer 
> has got memory, and that this memory has to be allocated, but from what I 
> understand of haskell, I would expect the interface and the RTS to do it for 
> me. And an integer multiplication, followed by an addition, is way cheaper 
> than accessing uncached memory. Or maybe I do not understand that pipelines, 
> hyperthreading and all that stuff would give you the same result ?

You are quite right that vector only supports nested arrays but not 
multidimensional ones. This is by design, however - the library's only goal is 
to provide efficient one-dimensional, Int-indexed arrays. I'm thinking about 
how to implement multidimensional arrays on top of vector but it's not that 
easy. While repa is a step in that direction, I also need to support mutable 
arrays and interoperability with C which complicates things immensely.

That said, if all you need is a matrix it's quite easy to implement the 
necessary index calculations yourself. Also, since you are working with 
numerics I highly recommend that you use either Data.Vector.Unboxed or 
Data.Vector.Storable instead of Data.Vector as boxing tends to be prohibitively 
expensive in this domain.

Roman


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

Reply via email to