def symbolic_matmul_and_bias(input_nodes_symbolic, weight_matrix, bias_vector):
    """ Computes a symbolic representations of nodes in a layer after matrix mul of the previous layer.
    :param input_nodes_symbolic: list of sympy expressions
    :param weight_matrix: 2D numpy array of shape (input_dim, output_dim)
    :param bias_vector: 1D numpy array of shape (output_dim)
    :return: list of sympy expressions at output nodes of length (output_dim)
    """

    def output_for_index(i):
        return bias_vector[i] + sum([w * x for w, x in zip(weight_matrix[:, i], input_nodes_symbolic)])

    return [output_for_index(i) for i in range(weight_matrix.shape[1])]