# qml.math.cov_matrix¶

cov_matrix(prob, obs, wires=None, diag_approx=False)[source]

Calculate the covariance matrix of a list of commuting observables, given the joint probability distribution of the system in the shared eigenbasis.

Note

This method only works for commuting observables. If the probability distribution is the result of a quantum circuit, the quantum state must be rotated into the shared eigenbasis of the list of observables before measurement.

Parameters
• prob (tensor_like) – probability distribution

• obs (list[Observable]) – a list of observables for which to compute the covariance matrix

• diag_approx (bool) – if True, return the diagonal approximation

• wires (Wires) – The wire register of the system. If not provided, it is assumed that the wires are labelled with consecutive integers.

Returns

the covariance matrix of size (len(obs), len(obs))

Return type

tensor_like

Example

Consider the following ansatz and observable list:

>>> obs_list = [qml.PauliX(0) @ qml.PauliZ(1), qml.PauliY(2)]
>>> ansatz = qml.templates.StronglyEntanglingLayers


We can construct a QNode to output the probability distribution in the shared eigenbasis of the observables:

dev = qml.device("default.qubit", wires=3)

def circuit(weights):
ansatz(weights, wires=[0, 1, 2])
# rotate into the basis of the observables
for o in obs_list:
o.diagonalizing_gates()
return qml.probs(wires=[0, 1, 2])


We can now compute the covariance matrix:

>>> shape = qml.templates.StronglyEntanglingLayers.shape(n_layers=2, n_wires=3)
>>> cov = qml.math.cov_matrix(circuit(weights), obs_list)
>>> cov
tensor([[0.9275379 , 0.05233832], [0.05233832, 0.99335545]], requires_grad=True)


Autodifferentiation is fully supported using all interfaces. Here we use autograd:

>>> cost_fn = lambda weights: qml.math.cov_matrix(circuit(weights), obs_list)[0, 1]