-from cvxopt import matrix, spmatrix
+"""
+Utility functions for working with CVXOPT matrices (instances of the
+``cvxopt.base.matrix`` class).
+"""
-def append_col(A,b):
- """
- Append the column ``b`` to the right side of the matrix ``A``.
+from math import sqrt
+from cvxopt import matrix
+
+def append_col(left, right):
"""
- return matrix([A.trans(),b.trans()]).trans()
+ Append the matrix ``right`` to the right side of the matrix ``left``.
+
+ EXAMPLES:
+
+ >>> A = matrix([1,2,3,4], (2,2))
+ >>> B = matrix([5,6,7,8,9,10], (2,3))
+ >>> print(append_col(A,B))
+ [ 1 3 5 7 9]
+ [ 2 4 6 8 10]
+ <BLANKLINE>
-def append_cols(cols):
"""
- Append a bunch of columns together, left to right.
+ return matrix([left.trans(), right.trans()]).trans()
+
+def append_row(top, bottom):
"""
- if len(cols) == 0:
- return cols
+ Append the matrix ``bottom`` to the bottom of the matrix ``top``.
- result = cols[0]
- del(cols[0])
- for column in cols:
- result = append_col(result, column)
+ EXAMPLES:
- return result
+ >>> A = matrix([1,2,3,4], (2,2))
+ >>> B = matrix([5,6,7,8,9,10], (3,2))
+ >>> print(append_row(A,B))
+ [ 1 3]
+ [ 2 4]
+ [ 5 8]
+ [ 6 9]
+ [ 7 10]
+ <BLANKLINE>
+ """
+ return matrix([top, bottom])
-def append_row(A,b):
+def identity(domain_dim):
"""
- Append the row ``b`` to the bottom of the matrix ``A``.
+ Return a ``domain_dim``-by-``domain_dim`` dense integer identity
+ matrix.
+
+ EXAMPLES:
+
+ >>> print(identity(3))
+ [ 1 0 0]
+ [ 0 1 0]
+ [ 0 0 1]
+ <BLANKLINE>
+
"""
- return matrix([A,b])
+ if domain_dim <= 0:
+ raise ValueError('domain dimension must be positive')
+
+ entries = [int(i == j)
+ for i in range(domain_dim)
+ for j in range(domain_dim)]
+ return matrix(entries, (domain_dim, domain_dim))
-def identity(n):
+
+def norm(matrix_or_vector):
"""
- Return the ``n``-by-``n`` identity matrix.
+ Return the Frobenius norm of ``matrix_or_vector``, which is the same
+ thing as its Euclidean norm when it's a vector (when one of its
+ dimensions is unity).
+
+ EXAMPLES:
+
+ >>> v = matrix([1,1])
+ >>> print('{:.5f}'.format(norm(v)))
+ 1.41421
+
+ >>> A = matrix([1,1,1,1], (2,2))
+ >>> norm(A)
+ 2.0
+
"""
- return spmatrix(1,range(n),range(n))
+ return sqrt(sum([x**2 for x in matrix_or_vector]))