Matrix and Vector classes
  from programming assignment 3 suffer
  from a few design flaws. In particular:
  Vector objects is identical to the code for
        adding and subtracting two \(n \times 1\) or 
	\(1 \times n\)  Matrix objects).
        Matrix class contains "unnecessary" methods
        (e.g., to pre-multiply and post-multiply a Matrix 
        by a Vector).
         Matrix and an
	\(n \times n\)  Matrix a 
	Vector or a \(1 \times n\)  Matrix?).
         
  To overcome these shortcomings, 
  in this assignment if you need a row Vector you
  will use a \(1 \times n\)  Matrix and if you
  need a column Vector you will use a 
  \(m \times 1\)  Matrix instead.
  However, you will still have a Vector "class" because
  it will contain the friend functions that are specific to
  Vector objects.
  
This assignment is about specialization in C++ (and, to a lesser extent, about templates). It does not use any new topics from our study of vector/matrix arithmetic.
Note that, as is traditional in many applications including computer graphics, we are now only considering column vectors. (If you need a row vector for some reason you can use a \(1 \times n\) matrix.)
Matrix class from
  from programming assignment 3.
  Next, you should make the following modifications to the copy:
Matrix.
    Vector.
          (It isn't necessary since a Vector "is a" 
          Matrix in this version.)
    double dot(const Matrix& a, const Matrix& b)
          that calculates the dot product (more commonly known as the
          scalar product) of two Matrix objects.
          (As with vectors, the dot/scalar product is the sum of the
          component-wise products of the elements. The dot/scalar product
          is only defined for matrices that have the same size.)
    double get(int i) const and another with the
          signature 
          double& operator()(int i)
          that return a 
          particular element of the calling Matrix if it contains
	  a single row or single column. They must throw an 
          out_of_range if i is out of range and
	  length_error is the Matrix is neither
          a single row or single column.
    Matrix getColumn(int c) const that returns
	  a column of the calling Matrix.
    Matrix multiply(const Vector& a, const Vector& b).
          (It isn't necessary since a Vector "is a" 
          Matrix in this version.)
    Matrix operator|(const Matrix& a, const Matrix& b)
          that concatenates the columns of the a and the
          columns of b.
    Vector operator*(const Vector& v, const Matrix& m)
          and
          Vector operator*(const Matrix& m, const Vector& v).
          (They aren't necessary since a Vector "is a" 
          Matrix in this version.)
    void setValues(const Matrix& other); that 
          is used by the copy constructor and the assignment operator.
    assertEquals() method that can be passed
    an object that has an operator==() function.
    It also includes an assertThrows() method that makes use
    of lambda expressions.
    
         pa4.zip that contains
    just Vector.h, Vector.cpp,
    Matrix.h, Matrix.cpp
    using Autolab.
  Vector class specializes
  the Matrix class, it does not contain any additional
  methods (other than constructors), nor does it override any methods
  in the Matrix class. In fact, the Vector
  class only exists to add friend functionality to the Matrix
  class.
  
  One could, instead, have a Vector class that "really"
  specializes the Matrix class and use distinct 
  Matrix and Vector objects. However, such
  a design would have several awkward aspects. You should ask yourself
  the following questions about such a design.
  
Vector object
        and a Matrix? What are the reasonable options?
  Matrix
        to either a column or row Vector? What is the
        type of the result?
  Vector
        class in order to provide type safety?
  Matrix and Vector classes.
  The parameter(s) of the templates will be the size(s) of the
  objects (i.e., the number of rows and columns).
  Copyright 2020