Small vector and matrix proposed for phobos2 now on github

Robert Jacques sandford at jhu.edu
Mon Apr 26 19:28:21 PDT 2010


On Mon, 26 Apr 2010 18:02:53 -0300, Gareth Charnock <gareth.tpc at gmail.com>  
wrote:
>> - 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.
>
> I'm afraid you've just set me off a rant. I apologise, but you just told  
> me that your web browser was Google.
>
> I think we may be heading for a culture clash. I approach vectors and  
> matrices from a math/physics background. Here vector's primary and only  
> purpose is to model a directed arrow in some space (3D space, function  
> space (lots and lots of things can be shoehorned into the idea of a  
> space) but always in some space.). Consequently, the only things that  
> matter about a vector are physical quantities. What are physical  
> quantities? Anything that is invariant under a coordinate transform. For  
> example, if you have a unit stick sitting due north and and you measure  
> it with a ruler sitting due north and one due east you conclude this:
>
> (1,0)
>
> But if you measure with two rulers due NW and NE you conclude:
>
> (0.707,0.707)
>
> These are a same physical vector. You can see this by using the rotation  
>   matrix between the coordinate systems:
>
> (0.707 -0.707)(1)=(0.707)
> (0.707  0.707)(0) (0.707)
>
> So the vector coordinates (a coincidence of the placement of the rulers)  
> are not physical but the vector is. I don't think I have never seen a  
> physical equation requiring a element by element multiplication but I  
> have seen lots of dot products. There is a reason for this. The dot  
> product of a vector with another vector gives you a scalar. A scalar is  
> not just a number (vector components are numbers but not scalars), a  
> scalar is a number that does not change under a coordinate transform.  
> The height of a hill does not change when you draw a map in different  
> ways so it that is a scalar. The element by element product does not  
> yield anything other than N numbers which are an accident of the  
> coordinate system.
>
> Matrices are either a system of linear equations or a representation of  
> a tensor. Again, the most natural way to combine them is the matrix  
> product (although there are other natural ways: direct product,  
> kronchecker product and index contraction). The best way to think about  
> a matrix is not to think about the matrix components, but as an  
> indivisible whole. Element by element multiplication seems equally  
> arbarant.
>
> These things have been so deeply ingrained that I didn't even consider  
> an element by element product in the design and I had to do a double  
> take before I got what was being asked for. When the dot product was  
> asked for as a "dot" I thought it would replace
>
> I'd consider any use of element by element multiplication has probably a  
> sign of a hack, and possibly a sign that what you are trying to use a  
> vector for is actually an array of numbers. Hacks are fine but I don't  
> think they're worth an operator. I'd want a big, explicit  
> elementWiseProduct() to tell me something was going on.
>
> Good user interfaces are modelled on the principle of least surprise. I  
> think there are two different models of least surprise here. I want  
> transcribe my matrix-vector equations directly into D and:
>
> u=Ap+Bq   p,q,u vectors, A matrix, B matrix
>
> Looks better as:
> u=A*p+B*q;
>
> Than:
> u=matrix_vector_product(A,p) + matrix_vector_product(B,q)
>
> But I think programmers are more used to using vector and array  
> interchangeably. Possibly this is a reason why a vector struct is needed  
> rather than defining free operators over just any old array. You want  
> the operators to have their vector-meanings for vectors while retaining  
> their field-meanings when dealing with fields like float, double, real  
> etc.
>
> Here's another one from the C++ standard library. std::complex is a pair  
> of numbers. Why isn't operator* a element wise multiplication with an  
> separate complex_product(.,.)? Because if you use std::complex you  
> probably want to model complex numbers.
>
> tl;dr
> Google is not really your web browser, even though I know what you mean.  
> An array is not really a vector, especially when  3D (or any other D)  
> space .
>
>
> ....
>
> PS: Okay so I just had a looked at the matrix and vector classes in  
> Ogre3D and irrlicht. Looks like they both define v*v as element wise  
> multiplication but m*m is matrix multiplication. That just seems even  
> more inconsistent.

Personally, I'd expect a pure mathematician to argue that the * operator  
isn't equivalent to the • operator and might even argue for the more  
formal <,> operator. :) Remember, unlike complex numbers, * isn't defined  
between vector types, so the library needs to decide what operator it's  
mapping to it. As for principal of least surprise, lots of libraries op  
for using array-wise * and v.dot(v), including (IIRC) all of the various  
GPU shading/compute languages.

P.S. I use Opera for my web browsing.


More information about the Digitalmars-d-announce mailing list