【问题标题】:Calculating log2 of a matrix计算矩阵的 log2
【发布时间】:2019-08-26 13:15:51
【问题描述】:

我正在尝试计算以 2 为底的对数(在here 中描述的以 2 为底的矩阵指数的反函数的意义上,不是按元素计算的)一个带有python的矩阵。由于 log() 采用元素对数,我做了一些谷歌研究以找到适用于我的任务的东西。我的研究只给了我 scipy 函数 logm(X),它返回了矩阵 X 的自然矩阵对数。

如上所述,我需要使用 python 找到矩阵的以 2 为底的对数。当然我知道公式 $log_a(x) = ln(x)/ln(a)$ 其中 ln 是自然对数,但据我了解,这仅适用于标量参数 X我错了)。至少我还没有看到任何论据为什么这也适用于矩阵。

那么有人知道是否存在这样的内置matrix-log2函数吗?

或者: 由于我几年前使用过 Mathematica,所以我知道函数 MatrixFunction[],这可能是解决我的问题的一步(如 here 所讨论的),现在我想知道这样的函数是否Python中也存在吗?

感谢您的帮助!

PS:在我看来here 提出的解决方案不起作用

【问题讨论】:

  • 您是否尝试过对 log_2(x) 使用泰勒级数,用矩阵供电代替标量供电?

标签: python math matrix symbolic-math logarithm


【解决方案1】:

为什么你认为它只适用于标量参数?让我们来玩简单的旋转矩阵

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]]

在我看来一切都是一致的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多