# 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