Matrix Formatting

This appendix describes ways to customize the formatting of CVXOPT matrices.

As with other Python objects, the functions repr and str return strings with printable representations of matrices. The command ‘print A’ executes ‘str(A)’, whereas the command ‘A’ calls ‘repr(A)’. The following example illustrates the default formatting of dense matrices.

>>> from cvxopt import matrix
>>> A = matrix(range(50), (5,10), 'd')
>>> A
<5x10 matrix, tc='d'>
>>> print(A)
[ 0.00e+00  5.00e+00  1.00e+01  1.50e+01  2.00e+01  2.50e+01  3.00e+01 ... ]
[ 1.00e+00  6.00e+00  1.10e+01  1.60e+01  2.10e+01  2.60e+01  3.10e+01 ... ]
[ 2.00e+00  7.00e+00  1.20e+01  1.70e+01  2.20e+01  2.70e+01  3.20e+01 ... ]
[ 3.00e+00  8.00e+00  1.30e+01  1.80e+01  2.30e+01  2.80e+01  3.30e+01 ... ]
[ 4.00e+00  9.00e+00  1.40e+01  1.90e+01  2.40e+01  2.90e+01  3.40e+01 ... ]

The format is parameterized by the dictionary options in the module cvxopt.printing. The parameters options['iformat'] and options['dformat'] determine, respectively, how integer and double/complex numbers are printed. The entries are Python format strings with default values '% .2e' for 'd' and 'z' matrices and % i' for 'i' matrices. The parameters options['width'] and options['height'] specify the maximum number of columns and rows that are shown. If options['width'] is set to a negative value, all columns are displayed. If options['height'] is set to a negative value, all rows are displayed. The default values of options['width'] and options['height'] are 7 and -1, respectively.

>>> from cvxopt import printing
>>> printing.options
{'width': 7, 'dformat': '% .2e', 'iformat': '% i', 'height': -1}
>>> printing.options['dformat'] = '%.1f'
>>> printing.options['width'] = -1
>>> print(A)
[ 0.0  5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0]
[ 1.0  6.0 11.0 16.0 21.0 26.0 31.0 36.0 41.0 46.0]
[ 2.0  7.0 12.0 17.0 22.0 27.0 32.0 37.0 42.0 47.0]
[ 3.0  8.0 13.0 18.0 23.0 28.0 33.0 38.0 43.0 48.0]
[ 4.0  9.0 14.0 19.0 24.0 29.0 34.0 39.0 44.0 49.0]

In order to make the built-in Python functions repr and str accessible for further customization, two functions are provided in CVXOPT. The function cvxopt.matrix_repr is used when repr is called with a matrix argument; and cvxopt.matrix_str is used when str is called with a matrix argument. By default, the functions are set to printing.matrix_repr_default and printing.matrix_str_default, respectively, but they can be redefined to any other Python functions. For example, if we prefer A to return the same output as print A, we can simply redefine cvxopt.matrix_repr as shown below.

>>> import cvxopt
>>> from cvxopt import matrix, printing
>>> A = matrix(range(4), (2,2), 'd')
>>> A
<2x2 matrix, tc='d'>
>>> cvxopt.matrix_repr = printing.matrix_str_default
>>> A
[ 0.00e+00  2.00e+00]
[ 1.00e+00  3.00e+00]

The formatting for sparse matrices is similar. The functions repr and str for sparse matrices are cvxopt.spmatrix_repr and cvxopt.spmatrix_str, respectively. By default, they are set to printing.spmatrix_repr_default and printing.spmatrix_repr_str.

>>> import cvxopt
>>> from cvxopt import printing, spmatrix
>>> A = spmatrix(range(5), range(5), range(5), (5,10))
>>> A
<5x10 sparse matrix, tc='d', nnz=5>
>>> print(A)
[ 0.00e+00     0         0         0         0         0         0     ... ]
[    0      1.00e+00     0         0         0         0         0     ... ]
[    0         0      2.00e+00     0         0         0         0     ... ]
[    0         0         0      3.00e+00     0         0         0     ... ]
[    0         0         0         0      4.00e+00     0         0     ... ]
>>> cvxopt.spmatrix_repr = printing.spmatrix_str_default
>>> A
[ 0.00e+00     0         0         0         0         0         0     ... ]
[    0      1.00e+00     0         0         0         0         0     ... ]
[    0         0      2.00e+00     0         0         0         0     ... ]
[    0         0         0      3.00e+00     0         0         0     ... ]
[    0         0         0         0      4.00e+00     0         0     ... ]

As can be seen from the example, the default behaviour is to print the entire matrix including structural zeros. An alternative triplet printing style is defined in printing.spmatrix_str_triplet.

>>> cvxopt.spmatrix_str = printing.spmatrix_str_triplet
>>> print(A)
(0,0)  0.00e+00
(1,1)  1.00e+00
(2,2)  2.00e+00
(3,3)  3.00e+00
(4,4)  4.00e+00