On Mon, 26 Apr 2010 03:46:47 -0300, Gareth Charnock <gareth....@gmail.com> wrote:

Thanks. To quickly answer this:

> - The version I'm seeing on github doesn't seem to have all the features > you're referencing (i.e. v*v). Why are some ops limited to */ and other +-?

It was quite late (3am) when I typed up that email. I'm sorry if I got the ops wrong. v*v was actually rejected in favour of dot(v,v). Unless I've made another mistake the implemented operators are:

v*s    v/s    v*=s
v/=s   v+v    v-v
v+=v   v-=v   m+m
m-m    m*m    m*v

(where v is a vector, m a matrix, s a scalar)

The reason the feature set is very limited is I wanted to get feedback before implementing a large set of features and then having to change things. The idea was to implement just enough so that it would be clear where I was going. For example, I wasn't aware that compile time foreach was a bad way to unroll loops (perhaps I should build a mixin string?).

- Element wise *, etc are important operators that you need to cleanly support. Design-wise, since we can't do Matlab style operators, I prefer */+- to be element wise, and then use dot/cross/solve for matrix ops. This seems to avoid the confusion of as having some ops be matrix style and some ops be array style. Since D is unicode, you could also add the real inner product operator as an alias. Also, don't forget the outer product, aka broadcasting, i.e. v.dot(v.T). - static foreach seems to add some overhead, although I don't know why. What you should really do is write some benchmarks and test static foreach, array ops and hand-unrolling for several vector sizes.

Reply via email to