from math import sqrt
from cvxopt import matrix
+from cvxopt.lapack import syev
def append_col(left, right):
"""
"""
return matrix([top, bottom])
+
+def eigenvalues(real_matrix):
+ """
+ Return the eigenvalues of the given ``real_matrix``.
+
+ EXAMPLES:
+
+ >>> A = matrix([[2,1],[1,2]], tc='d')
+ >>> eigenvalues(A)
+ [1.0, 3.0]
+
+ """
+ domain_dim = real_matrix.size[0] # Assume ``real_matrix`` is square.
+ eigs = matrix(0, (domain_dim, 1), tc='d')
+ syev(real_matrix, eigs)
+ return list(eigs)
+
+
def identity(domain_dim):
"""
Return a ``domain_dim``-by-``domain_dim`` dense integer identity
return matrix(entries, (domain_dim, domain_dim))
+def inner_product(vec1, vec2):
+ """
+ Compute the (Euclidean) inner product of the two vectors ``vec1``
+ and ``vec2``.
+
+ EXAMPLES:
+
+ >>> x = [1,2,3]
+ >>> y = [3,4,1]
+ >>> inner_product(x,y)
+ 14
+
+ >>> x = matrix([1,1,1])
+ >>> y = matrix([2,3,4], (1,3))
+ >>> inner_product(x,y)
+ 9
+
+ >>> x = [1,2,3]
+ >>> y = [1,1]
+ >>> inner_product(x,y)
+ Traceback (most recent call last):
+ ...
+ TypeError: the lengths of vec1 and vec2 must match
+
+ """
+ if not len(vec1) == len(vec2):
+ raise TypeError('the lengths of vec1 and vec2 must match')
+
+ return sum([x*y for (x, y) in zip(vec1, vec2)])
+
+
def norm(matrix_or_vector):
"""
Return the Frobenius norm of ``matrix_or_vector``, which is the same
2.0
"""
- return sqrt(sum([x**2 for x in matrix_or_vector]))
+ return sqrt(inner_product(matrix_or_vector, matrix_or_vector))
+
+
+def vec(real_matrix):
+ """
+ Create a long vector in column-major order from ``real_matrix``.
+
+ EXAMPLES:
+
+ >>> A = matrix([[1,2],[3,4]])
+ >>> print(A)
+ [ 1 3]
+ [ 2 4]
+ <BLANKLINE>
+
+ >>> print(vec(A))
+ [ 1]
+ [ 2]
+ [ 3]
+ [ 4]
+ <BLANKLINE>
+
+ Note that if ``real_matrix`` is a vector, this function is a no-op:
+
+ >>> v = matrix([1,2,3,4], (4,1))
+ >>> print(v)
+ [ 1]
+ [ 2]
+ [ 3]
+ [ 4]
+ <BLANKLINE>
+ >>> print(vec(v))
+ [ 1]
+ [ 2]
+ [ 3]
+ [ 4]
+ <BLANKLINE>
+
+ """
+ return matrix(real_matrix, (len(real_matrix), 1))