def test_mat_op_inverse(fn): # Sparse case sparse_mat = _sparse_matrix(fn) op_sparse = MatrixOperator(sparse_mat, fn, fn) op_sparse_inv = op_sparse.inverse assert op_sparse_inv.domain == op_sparse.range assert op_sparse_inv.range == op_sparse.domain assert all_almost_equal(op_sparse_inv.matrix, np.linalg.inv(op_sparse.matrix.todense())) assert all_almost_equal(op_sparse_inv.inverse.matrix, op_sparse.matrix.todense()) # Test application x = noise_element(fn) assert all_almost_equal(x, op_sparse.inverse(op_sparse(x))) # Dense case dense_mat = _dense_matrix(fn) op_dense = MatrixOperator(dense_mat, fn, fn) op_dense_inv = op_dense.inverse assert op_dense_inv.domain == op_dense.range assert op_dense_inv.range == op_dense.domain assert all_almost_equal(op_dense_inv.matrix, np.linalg.inv(op_dense.matrix)) assert all_almost_equal(op_dense_inv.inverse.matrix, op_dense.matrix) # Test application x = noise_element(fn) assert all_almost_equal(x, op_dense.inverse(op_dense(x)))
def test_matrix_op_inverse(): """Test if the inverse of matrix operators is correct.""" dense_matrix = np.ones((3, 3)) + 4 * np.eye(3) # invertible sparse_matrix = scipy.sparse.coo_matrix(dense_matrix) # Default 1d case dmat_op = MatrixOperator(dense_matrix) smat_op = MatrixOperator(sparse_matrix) x = noise_element(dmat_op.domain) md_x = dmat_op(x) mdinv_md_x = dmat_op.inverse(md_x) assert all_almost_equal(x, mdinv_md_x) ms_x = smat_op(x) msinv_ms_x = smat_op.inverse(ms_x) assert all_almost_equal(x, msinv_ms_x) # Multi-dimensional case domain = odl.tensor_space((2, 2, 3), dense_matrix.dtype) mat_op = MatrixOperator(dense_matrix, domain, axis=2) x = noise_element(mat_op.domain) m_x = mat_op(x) minv_m_x = mat_op.inverse(m_x) assert all_almost_equal(x, minv_m_x)