numpy中有没有一种方法可以测试矩阵是否是单一的
Is there a way in numpy to test whether a matrix is Unitary
我想知道numpy中有没有函数可以判断一个矩阵是否是酉矩阵?
这是我写的函数,但它不起作用。如果你们能在我的函数中发现错误,我将不胜感激 and/or 告诉我另一种方法来确定给定矩阵是否为酉矩阵。
def is_unitary(matrix: np.ndarray) -> bool:
unitary = True
n = matrix.size
error = np.linalg.norm(np.eye(n) - matrix.dot( matrix.transpose().conjugate()))
if not(error < np.finfo(matrix.dtype).eps * 10.0 *n):
unitary = False
return unitary
让我们来看一个明显的酉数组:
>>> a = 0.7
>>> b = (1-a**2)**0.5
>>> m = np.array([[a,b],[-b,a]])
>>> m.dot(m.conj().T)
array([[ 1., 0.],
[ 0., 1.]])
并在上面尝试你的函数:
>>> is_unitary(m)
Traceback (most recent call last):
File "<ipython-input-28-8dc9ddb462bc>", line 1, in <module>
is_unitary(m)
File "<ipython-input-20-3758c2016b67>", line 5, in is_unitary
error = np.linalg.norm(np.eye(n) - matrix.dot( matrix.transpose().conjugate()))
ValueError: operands could not be broadcast together with shapes (4,4) (2,2)
这是因为
>>> m.size
4
>>> np.eye(m.size)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
如果我们将 n = matrix.size
替换为 len(m)
或 m.shape[0]
或其他内容,我们将得到
>>> is_unitary(m)
True
我可能会用
>>> np.allclose(np.eye(len(m)), m.dot(m.T.conj()))
True
其中 allclose
有 rtol
和 atol
参数。
如果您使用的是 NumPy 的 matrix class,Hermitian 共轭有一个 属性,因此:
def is_unitary(m):
return np.allclose(np.eye(m.shape[0]), m.H * m)
例如
In [79]: P = np.matrix([[0,-1j],[1j,0]])
In [80]: is_unitary(P)
Out[80]: True
我想知道numpy中有没有函数可以判断一个矩阵是否是酉矩阵?
这是我写的函数,但它不起作用。如果你们能在我的函数中发现错误,我将不胜感激 and/or 告诉我另一种方法来确定给定矩阵是否为酉矩阵。
def is_unitary(matrix: np.ndarray) -> bool:
unitary = True
n = matrix.size
error = np.linalg.norm(np.eye(n) - matrix.dot( matrix.transpose().conjugate()))
if not(error < np.finfo(matrix.dtype).eps * 10.0 *n):
unitary = False
return unitary
让我们来看一个明显的酉数组:
>>> a = 0.7
>>> b = (1-a**2)**0.5
>>> m = np.array([[a,b],[-b,a]])
>>> m.dot(m.conj().T)
array([[ 1., 0.],
[ 0., 1.]])
并在上面尝试你的函数:
>>> is_unitary(m)
Traceback (most recent call last):
File "<ipython-input-28-8dc9ddb462bc>", line 1, in <module>
is_unitary(m)
File "<ipython-input-20-3758c2016b67>", line 5, in is_unitary
error = np.linalg.norm(np.eye(n) - matrix.dot( matrix.transpose().conjugate()))
ValueError: operands could not be broadcast together with shapes (4,4) (2,2)
这是因为
>>> m.size
4
>>> np.eye(m.size)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
如果我们将 n = matrix.size
替换为 len(m)
或 m.shape[0]
或其他内容,我们将得到
>>> is_unitary(m)
True
我可能会用
>>> np.allclose(np.eye(len(m)), m.dot(m.T.conj()))
True
其中 allclose
有 rtol
和 atol
参数。
如果您使用的是 NumPy 的 matrix class,Hermitian 共轭有一个 属性,因此:
def is_unitary(m):
return np.allclose(np.eye(m.shape[0]), m.H * m)
例如
In [79]: P = np.matrix([[0,-1j],[1j,0]])
In [80]: is_unitary(P)
Out[80]: True