计算矩阵的 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]]

我觉得一切都一致