0
$\begingroup$

I need to find a matrix M such that M.u = v, where u and v are known vectors. I don't understand how to do this with LinearSolve, which seems only to solve for the vectors and not the matrices in these types of equation.

Is there a function for this?

$\endgroup$

3 Answers 3

3
$\begingroup$

There are too many matrixs satisfy the equation M.u==v.

Without loss general, we can Normalize the vector u and v.

Besides the RotationMatrix which have mention by @Daniel Huber, we can construct the reflect-matrix by hand which also satisfiy the equation M.u==v

u = Normalize[{x, y, z}, Sqrt[#.#] &]; v = Normalize[{a, b, c}, Sqrt[#.#] &]; normal = Normalize[u - v, Sqrt[#.#] &]; M = IdentityMatrix[3] - 2 Outer[Times, normal, normal]; M.u == v // Simplify 

True

ReflectionMatrix maybe another choise.

u = Normalize[{x, y, z}, Sqrt[#.#] &]; v = Normalize[{a, b, c}, Sqrt[#.#] &]; normal = Normalize[u - v, Sqrt[#.#] &]; M = Simplify[ReflectionMatrix[normal], normal ∈ Reals]; M.u == v // Simplify 

True

For difference dimensions vector u and v,we can also combine the matrixs such as projection matirx and reflection matrix and rotation matirx to construct such matrix.

$\endgroup$
1
  • $\begingroup$ Excellent solution, thanks! It's wonderful that this question got three separate answers, all embodying different ideas, and all of which work. $\endgroup$ Commented Nov 9, 2020 at 19:07
4
$\begingroup$

You can use a fitting procedure to find a solution. It's not going to be unique, though.

u = RandomReal[1, {3}] v = RandomReal[1, {5}] mat = Array[x, {Length[v], Length[u]}] sol = NMinimize[Total[(mat.u - v)^2], Flatten[mat]]; mat /. Last[sol] 

Check that the residuals are 0:

mat.u - v /. Last[sol] 
$\endgroup$
2
$\begingroup$

You may search for a rotation matrix that turns the direction of u into the direction of v. Applying this matrix to u gives a vector in the direction of v, but with a different length. Therefore you must adjust the rotation matrix by multiplying by the length of v and divide by the length of u. THis can be done in MMA by:

{u, v} = RandomReal[{-1, 1}, {2, 3}] m = RotationMatrix[{u, v}] Norm[v]/Norm[u] 

m maps now u into v:

m.u == v (*True*) 
$\endgroup$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.