Source code for cla_utils.exercises1
import numpy as np
import timeit
import numpy.random as random
# pre-construct a matrix in the namespace to use in tests
random.seed(1651)
A0 = random.randn(500, 500)
x0 = random.randn(500)
[docs]def basic_matvec(A, x):
    """
    Elementary matrix-vector multiplication.
    :param A: an mxn-dimensional numpy array
    :param x: an n-dimensional numpy array
    returns an m-dimensional numpy array which is the product of A with x
    This should be implemented using a double loop over the entries of A
    :return b: m-dimensional numpy array
    """
    raise NotImplementedError 
[docs]def column_matvec(A, x):
    """
    Matrix-vector multiplication using the representation of the product
    Ax as linear combinations of the columns of A, using the entries in 
    x as coefficients.
    :param A: an mxn-dimensional numpy array
    :param x: an n-dimensional numpy array
    :return b: an m-dimensional numpy array which is the product of A with x
    This should be implemented using a single loop over the entries of x
    """
    raise NotImplementedError 
[docs]def timeable_basic_matvec():
    """
    Doing a matvec example with the basic_matvec that we can
    pass to timeit.
    """
    b = basic_matvec(A0, x0) # noqa 
[docs]def timeable_column_matvec():
    """
    Doing a matvec example with the column_matvec that we can
    pass to timeit.
    """
    b = column_matvec(A0, x0) # noqa 
[docs]def timeable_numpy_matvec():
    """
    Doing a matvec example with the builtin numpy matvec so that
    we can pass to timeit.
    """
    b = A0.dot(x0) # noqa 
[docs]def time_matvecs():
    """
    Get some timings for matvecs.
    """
    print("Timing for basic_matvec")
    print(timeit.Timer(timeable_basic_matvec).timeit(number=1))
    print("Timing for column_matvec")
    print(timeit.Timer(timeable_column_matvec).timeit(number=1))
    print("Timing for numpy matvec")
    print(timeit.Timer(timeable_numpy_matvec).timeit(number=1)) 
[docs]def rank2(u1, u2, v1, v2):
    """
    Return the rank2 matrix A = u1*v1^* + u2*v2^*.
    :param u1: m-dimensional numpy array
    :param u2: m-dimensional numpy array
    :param v1: n-dimensional numpy array
    :param v2: n-dimensional numpy array
    """
    raise NotImplementedError
    A = B.dot(C)
    return A 
[docs]def rank1pert_inv(u, v):
    """
    Return the inverse of the matrix A = I + uv^*, where I
    is the mxm dimensional identity matrix, with
    :param u: m-dimensional numpy array
    :param v: m-dimensional numpy array
    """
    raise NotImplementedError
    return Ainv 
[docs]def ABiC(Ahat, xr, xi):
    """Return the real and imaginary parts of z = A*x, where A = B + iC
    with
    :param Ahat: an mxm-dimensional numpy array with Ahat[i,j] = B[i,j] \
    for i>=j and Ahat[i,j] = C[i,j] for i<j.
    :return zr: m-dimensional numpy arrays containing the real part of z.
    :return zi: m-dimensional numpy arrays containing the imaginary part of z.
    """
    raise NotImplementedError
    return zr, zi