
On Tue, Jun 13, 2006 at 05:31:58PM +0200, Janek Kozicki wrote:
Andy Little said: (by the date of Tue, 13 Jun 2006 00:59:11 +0100)
There are also spaces where the units (or more accurately, the dimensions) are not the same in all directions, so any vectors in those spaces will have mixed units in any coordinate system. A commonly used one is called "phase space" and it includes the position and momentum variables for a system all in the same space. Thinking of them together turns out to be quite important in some applications, so the example can be quite meaningful for some people.
That is interesting, though I find anything beyond the usual space difficult to visualise. The ability to visualise things such as this seems to be what marks out mathematicians.
... and engineers? physicians? I'm not sure to which category I could belong (certainly not mathematician) but "phase space" is quite common when working with engineering problems. It is the most handy way to represent what is going on in any given point of space. However vector operations between vectors in "phase space" are different than dot_product and cross_product. Those two operations make no sense in fact.
It is although common to multiply such vectors by some matrices...
I would suggest that instead of trying to make an extremely general vector class, it'd be better to make an extremely specific vector class, together with an extremely general way to other vector classes. Specifically, you can make vector3 (or vector<3>, perhaps) a straightforward single unit Euclidean vector. It can have L2 norms and L^inf norms and cross products and all the operations that are undefined for vectors with components of different units. Then we could define a vector space variant of boost::operators to convert any tuple-like type into a vector space type. If you wanted phase space, you'd do something like this: template<class Q,class P> class phase_vector:public boost::vector_operators<phase_vector> { public: static const int vector_operators_dimension = 2; vector<Q> position vector<P> momentum; phase_vector(const vector<Q>& position,const vector<P>& momentum) :position(position),momentum(momentum) {} // these would need to be generalized to get<n>() vector<Q>& first() {return position;} vector<P>& second() {return momentum;} }; and the vector_operators class would fill in scalar multiplication and addition-related operators. In my opinion, this would be far more useful than writing phase space as vector<m,m,m,kg_m_div_s,kg_m_div_s,kg_m_div_s> Geoffrey