# Is it possible to change the coordinates / basis to an arbitrary choice?

I know Mathematica can change the coordinate system with the command ''CoordinateTransform''.For example, you can change the coordinates of an $$(x,y,z)$$ vector in cartesian coordinates like this.

CoordinateTransform[
"Cartesian" -> "Cylindrical", {x, y,z}]


And Mathematica will return the vector in the cylindrical coordinates system $$(\rho,\phi,z)$$.

However, I think it only works with some well-know basis such as the polar, the cylindrical the spherical... which the software has as default. I was wondering if this change of coordinates could be done for an arbitrary choice of the basis. For instance, say I want to plot several $$\mathbb{R}^2$$ vectors in this particular basis $$\{(-1,-1),(1,1)\}$$ for some reason. Can Mathematica do it?

This answer is similar to @DanielHuber's answer, but using the relevant linear algebra more explicitly:

basis = {{-1, 1}, {1, 1}};
vectors = {{1, 1}, {3, 2}, {0, 1}};
Inverse[basis] . # & /@ vectors
(* {{0, 1}, {-(1/2), 5/2}, {1/2, 1/2}} *)


If the vectors themselves are given in a non-standard basis, we first convert to the canonical basis:

basis0 = {{0, 1}, {1, 0}};
basis1 = {{-1, 1}, {1, 1}};
vectors = {{1, 1}, {3, 2}, {0, 1}};
Inverse[basis1] . basis0 . # & /@ vectors
(* {{0, 1}, {1/2, 5/2}, {-(1/2), 1/2}} *)


This makes use of the fact that converting a vector $$\vec v$$ from a given basis $$(\vec b_i)_i$$ to the canonical basis $$(\hat{\vec e}_i)_i$$ is simply given by the matrix-vector product,

$$\tilde{\vec v}=B\cdot\vec v$$

where $$B$$ is the matrix with the basis vectors $$\vec b_i$$ as rows (using Mathematica's convention of row/column vectors in relation to the dot product). Likewise, converting the other was is done by the inverse of the matrix,

$$\vec v=B^{-1}\cdot\tilde{\vec v}$$

• Thank you both for the comments!! They've helped me a lot. Just one more thing: Do you know if it is possible to plot the vectors using the new basis (axis, gridline) just like PolarPlot does with the polar system?? Dec 1, 2022 at 14:28

To start with, {(−1,−1),(1,1)} is not a basis because the two vectors are antiparallel. I therefore take {(−1,1),(1,1)} as basis for an example.

Call the original bas bas0 and the new base, written in the old coordinates, bas1:

bas0 = {{1, 0}, {0, 1}};
bas1 = {{-1, 1}, {1, 1}};


We now need to write the old base vectors {1,0} and {0, 1} in the new base bas1.

{1, 0} == (-bas1[[1]] + bas1[[2]] )/2
{0, 1} == (bas1[[1]] + bas1[[2]] )/2


A vector: v=x{1,0}+y{0,1} in the old coordinates: {x,y} can be written in the new basis:v= xn{-1,1} + yn{1,1} with new coordinates:{xn,yn}. Therefore, to get the new from the old coordinates:

Solve[{x, y} . bas0 == {xn, yn} . bas1, {xn, yn}]

(* {{xn -> 1/2 (-x + y), yn -> (x + y)/2}} *)


We may define a function for this:

old2new[p:{x_,y_}]= {{-1,1}/2,{1,1}/2}.p


We may now test if a vector, written in the new coordinates, is still the same vector by:

old2new[{x, y}] . bas1 == {x, y} . bas0
(* True *)