Small vector and matrix proposed for phobos2 now on github

Robert Jacques sandford at jhu.edu
Sun Apr 25 19:44:50 PDT 2010


On Sun, 25 Apr 2010 23:17:10 -0300, Gareth Charnock <gareth.tpc at gmail.com>  
wrote:
> I've put the beginnings of my matrix-vector library up on github  
> (between swizzling, generalising to N dimensions and making use of  
> static foreach this project quickly turned from a cleanup to a rewrite).  
> You can find it here.
>
> http://github.com/gcharnock/phoboslinalgebra
>
> Some highlights so far:
>
> //Dimension and field are templatable parameters. There is no hard limit  
> on N, but obviously everything is set up for N being small.
> alias Vector!(float,3) vector_t;
> alias Matrix!(float,3) matrix_t;
>
> //Very natural initialisation
> auto v=vector_t(1,2,3);
> auto m=matrix_t(1,2,0,0,1,0,0,3,1);
>
> //Single element access does not require opDispatch
> writeln(v.x);
>
> //Swizzling supported via opDispatch
> writeln(v.yzx); //2 3 1
> writeln(v.xxyyzx); //1 1 2 2 3 1
>
> //No matter how big N, elements always have a canonical name (probably  
> more important for matrices where the letters of the alphabet run out  
> faster although I've only done this for vectors so far)
> writeln(v.x2); //3
> writeln(v.x0x1x2); //1 2 3, zero based indexing because D inherits C
>
> //Some Math operations. Static foreach is used to unroll all loops.  
> Unfortunately I ran into some problems putting the operators outside the  
> struct. I'm not sure if this was me or the compiler but I'll need  
> another hacking session to work out what's going on.
>
> float s;
> v*s    v/s    v*=s
> v/=s   v+v    v-v
> v*v    m+m    m-m
> m*m    m*v
>
> A question I'd like input on would what should the semantics of the  
> Transpose(), Transposed() function. I can think of some alternatives:
>
> Transpose:
> 1) Naive solution, copies N^^2-N scalars.
> 2) Set a bool. Switch between two element iteration schemes for nearly  
> every operation (with suitable use of templates this might not be as  
> painful as it sounds.)
>
> Transposed:
> 1) makes a new matrix
> 2) creates a transposed image which is forever linked to the original  
> matrix: A=B.Transpose() => Changes to A affect B
> 3) creates a transposed image which is copy-on-write linked to the  
> original matrix: A=B.Transpose() => Changes to A do not affect B

Some quick comments:
- 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 +-?
- Static foreach isn't a good way to do loop unrolling (at least  
historically).
- In terms of naming, I prefer float3 instead of vector3f.
- Return type and argument types need to be dynamically deduced: i.e. int3  
* float3 should work.
- length should mean the number of vector elements. I'd recommend norm or  
L2 instead.
- For the matrix, Field[D][D] raw; will let you get out of manual indexing  
issues.
- I've never seen matrix swizzling and don't really know what it would be  
used for.
- You should be able to set matrix layout to either C or Fortran style
- Re: Transpose: this should be an in place swap. Given the value-type  
semantics of small matrices, make the copies.
- Re: Transposed: this function should be named T (or have an equivalent  
alias) and return a reference to the current matrix casted to its C or  
Fortran layout counterpart.

In general, this feels like a decent start, although it's still very alpha  
and feature incomplete. Keep up the good work.


More information about the Digitalmars-d-announce mailing list