计算矩阵的 log2
Calculating log2 of a matrix
我正在尝试计算以 2 为底的对数(在以 2 为底的矩阵指数的反函数的意义上,如 here 所述,不是按元素计算) 的矩阵 python。由于 log() 采用元素对数,我做了一些 Google 研究以找到适用于我的任务的东西。我的研究只给了我 scipy 函数 logm(X),它返回矩阵 X 的自然矩阵对数。
如上所述,我需要找到 python 矩阵的以 2 为底的对数。我当然知道公式 $log_a(x) = ln(x)/ln(a)$ 其中 ln 是自然对数,但据我所知,这仅适用于标量参数 X(正确如果我错了,我)。至少我还没有看到任何争论为什么这也适用于矩阵。
那么有谁知道是否存在这样一个内置的 matrix-log2 函数?
或者:
由于几年前我使用过 Mathematica,我知道函数 MatrixFunction[],这可能是解决我的问题的一步(如讨论的 ),现在我想知道是否这样Python 中也存在函数吗?
感谢您的帮助!
PS:在我看来, 提出的解决方案行不通
为什么您认为它仅适用于标量参数?让我们玩简单的旋转矩阵
import numpy as np
from scipy.linalg import logm, expm
def log2M(a): # base 2 matrix logarithm
return logm(a)/np.log(2.0)
def p2M(a): # base 2 matrix exponent
return expm(np.log(2.0)*a)
alpha = 0.6
a = np.array([[np.cos(alpha), -np.sin(alpha)], [np.sin(alpha), np.cos(alpha)]])
print(a)
q = log2M(a)
print(q)
在这里你可以看到它产生了合理的输出,看起来像
[ 0 -alpha/log(2)]
[alpha/log(2) 0 ]
你可以将它与维基百科进行比较
我们可以将其计算为 1。按 log(2) 指数缩放 2。手动通过泰勒展开
并且两种方法打印相同的输出,代码如下
f = 1.0
r = np.array([[1.0, 0.0], [0.0, 1.0]])
eq = np.array([[1.0, 0.0], [0.0, 1.0]])
for k in range(1, 10):
r = np.dot(r, q)
f = f * np.float64(k) / np.log(2.0)
eq = eq + r / f
print(eq)
print(p2M(q))
输出
[[ 0.82533562 -0.56464247]
[ 0.56464247 0.82533562]]
[[ 0.82533561 -0.56464247]
[ 0.56464247 0.82533561]]
我觉得一切都一致
我正在尝试计算以 2 为底的对数(在以 2 为底的矩阵指数的反函数的意义上,如 here 所述,不是按元素计算) 的矩阵 python。由于 log() 采用元素对数,我做了一些 Google 研究以找到适用于我的任务的东西。我的研究只给了我 scipy 函数 logm(X),它返回矩阵 X 的自然矩阵对数。
如上所述,我需要找到 python 矩阵的以 2 为底的对数。我当然知道公式 $log_a(x) = ln(x)/ln(a)$ 其中 ln 是自然对数,但据我所知,这仅适用于标量参数 X(正确如果我错了,我)。至少我还没有看到任何争论为什么这也适用于矩阵。
那么有谁知道是否存在这样一个内置的 matrix-log2 函数?
或者:
由于几年前我使用过 Mathematica,我知道函数 MatrixFunction[],这可能是解决我的问题的一步(如讨论的
感谢您的帮助!
PS:在我看来,
为什么您认为它仅适用于标量参数?让我们玩简单的旋转矩阵
import numpy as np
from scipy.linalg import logm, expm
def log2M(a): # base 2 matrix logarithm
return logm(a)/np.log(2.0)
def p2M(a): # base 2 matrix exponent
return expm(np.log(2.0)*a)
alpha = 0.6
a = np.array([[np.cos(alpha), -np.sin(alpha)], [np.sin(alpha), np.cos(alpha)]])
print(a)
q = log2M(a)
print(q)
在这里你可以看到它产生了合理的输出,看起来像
[ 0 -alpha/log(2)]
[alpha/log(2) 0 ]
你可以将它与维基百科进行比较
我们可以将其计算为 1。按 log(2) 指数缩放 2。手动通过泰勒展开
并且两种方法打印相同的输出,代码如下
f = 1.0
r = np.array([[1.0, 0.0], [0.0, 1.0]])
eq = np.array([[1.0, 0.0], [0.0, 1.0]])
for k in range(1, 10):
r = np.dot(r, q)
f = f * np.float64(k) / np.log(2.0)
eq = eq + r / f
print(eq)
print(p2M(q))
输出
[[ 0.82533562 -0.56464247]
[ 0.56464247 0.82533562]]
[[ 0.82533561 -0.56464247]
[ 0.56464247 0.82533561]]
我觉得一切都一致