X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2Fdunshire%2Fmatrices.py;h=2006fd20427b999fd8061a74e89e03508b55f0f1;hb=4bf45d1711033bc419e1c48a7906f21de67ef791;hp=a33259e6f3e71f7a4b5f2d47234464d80a9a3199;hpb=56ea961887d507114174af5f92b8c3c77b0b7a50;p=dunshire.git diff --git a/src/dunshire/matrices.py b/src/dunshire/matrices.py index a33259e..2006fd2 100644 --- a/src/dunshire/matrices.py +++ b/src/dunshire/matrices.py @@ -5,6 +5,7 @@ Utility functions for working with CVXOPT matrices (instances of the from math import sqrt from cvxopt import matrix +from cvxopt.lapack import syev def append_col(left, right): """ @@ -41,6 +42,24 @@ def append_row(top, bottom): """ 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 @@ -64,6 +83,37 @@ def identity(domain_dim): 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 @@ -81,4 +131,43 @@ def norm(matrix_or_vector): 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] + + + >>> print(vec(A)) + [ 1] + [ 2] + [ 3] + [ 4] + + + 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] + + >>> print(vec(v)) + [ 1] + [ 2] + [ 3] + [ 4] + + + """ + return matrix(real_matrix, (len(real_matrix), 1))