RandomUnitary
Revision as of 19:31, 22 November 2012 by Nathaniel (talk | contribs) (Created page with "{{Function |name=RandomUnitary |desc=Generates a random unitary or orthogonal matrix |req=opt_args |rel=RandomDensityMatrix<br />RandomStateVector<br />[[R...")
| RandomUnitary | |
| Generates a random unitary or orthogonal matrix | |
| Other toolboxes required | opt_args |
|---|---|
| Related functions | RandomDensityMatrix RandomStateVector RandomSuperoperator |
RandomUnitary is a function that generates a random unitary or orthogonal matrix, uniformly according to Haar measure.
Syntax
- U = RandomUnitary(DIM)
- U = RandomUnitary(DIM,RE)
- U = RandomUnitary(DIM,RE,DENS)
Argument descriptions
- DIM: The number of rows (or equivalently, columns) that U will have.
- RE (optional, default 0): A flag (either 0 or 1) indicating that U should only have real entries (RE = 1) or that it is allowed to have complex entries (RE = 1). That is, if you set RE = 1 then U will be an orthogonal matrix, not just a unitary matrix.
- DENS (optional, default 1): If equal to 1 then U will be a full matrix. If 0 <= DEN < 1 then U will be sparse with approximately DENS*DIM^2 non-zero entries. Note that the number of non-zero entries in this case is *very* approximate. Furthermore, if DENS < 1 then the distribution of U is no longer uniform in any mathematically well-defined sense.
Examples
A random qubit gate
To generate a random quantum gate that acts on qubits, you could use the following code:
>> RandomUnitary(2) ans = 0.2280 + 0.6126i -0.2894 - 0.6993i -0.3147 + 0.6883i -0.2501 + 0.6039i
A random orthogonal matrix
To generate a random orthogonal (rather than unitary) matrix, set RE = 1:
>> U = RandomUnitary(3,1)
U =
0.9805 -0.1869 -0.0603
0.1678 0.6381 0.7515
-0.1020 -0.7470 0.6570
To verify that this matrix is indeed orthogonal, we multiply it by its transpose:
>> U'*U
ans =
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000
A random sparse unitary matrix
To generate an 8-by-8 sparse unitary matrix with approximately 1/4 of its entries non-zero, we can use the following line of code:
>> RandomUnitary(8,0,1/4) ans = (2,1) 0 + 0.7140i (7,1) -0.0000 + 0.7002i (2,2) 0.5448 + 0.0000i (5,2) 0.6281 (7,2) -0.5555 - 0.0000i (2,3) 0.4398 - 0.0000i (5,3) -0.7781 + 0.0000i (7,3) -0.4485 + 0.0000i (8,4) 0 - 1.0000i (1,5) 1.0000 (3,6) 1.0000 (4,7) 1.0000 (6,8) 1.0000
Please remember that constructing random sparse unitary matrices in this way is very approximate – it is not uniformly distributed in any meaningful sense and the number of non-zero elements will sometimes not be very close to DENS*DIM^2.