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.