Enters matrix
Problem: In linear algebra, a linear
transform is a mapping of an m-dimensional vector into an n-dimensional vector.
Familiar examples of linear transformations include rotation and scaling of a
vector in the plane (a mapping from a 2-dimension vector to a 2-dimensional vector),
projection of a 3-dimensional vector into the plane (a mapping from a 3-dimension
vector to a 2-dimensional vector), and so on.
Linear transformation for n-dimensional vectors
into m-dimensional vectors is represented by a matrix of m-rows and n columns,
or an m x n matrix. Here
are some examples from Wikipedia; look under the heading “Linear transformations”.
Let M be an mxn matrix and V be an n-dimensional
vector. The m-dimensional vector U = {u_1, u_2,…, u_m} obtained by applying M
to V can be calculated by multiplying the matrix M and the vector V:
U = MV,
Where U_i = M_i · V, M_i
is the vector of the i-th row of matrix M and · is the inner product operator, i = 1, …, m.
For example,
A program is needed to compute the vector U,
the linear transformation of a given vector V and a matrix M. Specifically, prompt
the user to input the name of a file that contain a matrix with the following
format:
m n
elements of row 1
…
elements of row m
For the matrix above, the input file looks
like this:
2 3
1 2 3
4 5 6
Then, prompt the user to input a vector V of
the following format from the console
n [V_1, V_2, …, V_n].
When this is done, the program shall
compute the vector U when it is defined, or displays an error message when it
is not defined. Prompt the user whether to continue or stop.
In addition to the functional requirements
above, the program must meet the constraint of using class, functions, and
their tests from the project Inner Product project.
Step
U. Understanding the problem.
Functionally, the program is similar to the
inner product computation. Of course, we will need a new class to represent
matrix, and functions for computing linear transformation and doing file I/O.
By now, we have some experiences. We do need to consider the constraints of
asking us to use the units from inner product computation.
Step
D. Devising a plan.
Here are the tasks.
T1. Prepare two projects, Linear
Transformation and it test project.
T2. Write up the Matrix class with the member
functions to get row vectors and elements.
T3. Write unit tests for Matrix.
T4. Write file I/O for Matrix.
T5. Write tests for file I/O for Matrix.
T6. Write main function.
Step
C. Carrying out the plan.
Let’s start with T1. While the normal way
to reuse artifacts from the inner product project is to create a library and use
it from the current projects, for simplicity, we will just copy the source files
from the inner project into the linear transformation projects and it test projects.
The tasks T2 to T5 should pose little
challenge now, we will leave it to you as an exercise to complete them. As
before, I strongly encourage you to write up a unit test before you do the
member function or function. This has the effect of keeping the class and
functions small. However, beware of the memory management issue. Since memory
from heap will be used, rather than accepting the C++ defaults, you should write
the copy constructor, the destructor, and the assignment operator.
Step
L. Looking back.
We see that due to the separation of production
and test projects, we can now move at a steady pace by growing the code for
matrix piecemeal, all the while insisting that all unit tests pass.
Arguably, the present problem is no less
simple than the problem of computing inner products for two vectors. We are
able to handle it as a single problem, thanks to our experience from solving the
inner product problem. Our capability to handle problem grows.
© Y C Cheng, 2013, 2014. All rights reserved.