I am trying to find my kraus representation from my process matrix. Suppose that, I have these process matrix:

proces_matrix =  [[ 1.     0.     0.     0.   ]
  [-0.     0.537 -0.004 -0.005]
  [ 0.023  0.014  0.635 -0.03 ]
  [ 0.011 -0.009  0.017  0.883]]]

To find the kraus representation, I tried 2 methods.

  1. I first tried to use to_kraus function in qutip. According to API documentation, to_kraus Converts a Qobj representing a quantum map to a list of quantum objects, each representing an operator in the Kraus decomposition of the given map. When I gave my process matrix to the function, as a result I got my process matrix back.

The code is pretty simple:

    q_proces_matrix = qutip.Qobj(proces_matrix)
    kraus_rep = qutip.to_kraus(q_proces_matrix)
  1. Then I thought, I am doing something wrong so I asked this question, and thanks to a the answer, I first find my Choi matrix with the function of to_choi in qutip and then I used choi_to_kraus function in qutip. The definition of the function is enter link description here It takes choi matrices and turns kraus representations However I got my process matrices as output instead of Kraus representations.

The code is again pretty simple:

q_proces_matrix = qutip.Qobj(proces_matrix)
choi = qutip.to_choi(q_proces_matrix)
kraus_rep = qutip.choi_to_kraus(choi)
  1. AFter all, I just found the eigenvectors of my Choi matrices and It means the superket operation of my kraus representations. But I am quite confused what I did wrong with qutip function and I did not get my Kraus representations from the functions

Could someone explain me what I missed in qutip?

  • $\begingroup$ it might be easier to answer the question is you add a working code snippet showing what exactly you did $\endgroup$
    – glS
    Feb 3, 2022 at 11:27

1 Answer 1


In QuTiP, there are different Qobj types for operators and superoperators, and the function to_choi will only do what you expect it to if the input has type super. If you change qutip.Qobj(proces_matrix) to qutip.Qobj(proces_matrix, type='super'), everything should work.

The reason you get the same thing back otherwise is because QuTiP converts to type=oper by default with Qobj() and thus assumes your input is just an operator in the unvectorized convention, such as a single Kraus operator. Then with your code you ended up converting this to a Choi matrix and back to just a single Kraus operator.

  • 2
    $\begingroup$ As a follow up, this should also work by just using the to_kraus function directly - no need to convert to Choi matrix. If the argument given to to_kraus has type super, it will give you the Kraus operators correctly. $\endgroup$
    – Bebotron
    Feb 3, 2022 at 22:44
  • $\begingroup$ @chrysaor4 Thanks, you saved me!! $\endgroup$
    – quest
    Feb 3, 2022 at 23:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.