将np.einsum()转换为MATLAB

问题描述 投票:0回答:1

我在理解documentation of np.einsum()时遇到了麻烦。 np.einsum()如何解释?

我正在尝试在原始python上写subscripts,其中np.einsum('a...c,b...c', Y, conj(Y))是形状为Y的矩阵。另外,由于先前的实现差异,我的MATLAB C, F, T的大小为Y

[F, T, C]在每个组件中的索引是什么?我很困惑。

如何在MATLAB中编写相同的指令?

matlab code-translation numpy-einsum
1个回答
1
投票

'a...c,b...c'文档页面引用:

要启用和控制广播,请使用省略号。默认的NumPy样式广播是通过在每个术语的左侧添加省略号来完成的,例如einsum。要沿第一个轴和最后一个轴进行跟踪,可以执行np.einsum('...ii->...i', a),或者使用最左边的索引而不是最右边的索引做矩阵矩阵乘积,可以执行np.einsum('i...i', a)

稍后,给出一个例子:

np.einsum('ij...,jk...->ik...', a, b)

此示例的等效MATLAB代码为:

>>> a = np.arange(25).reshape(5,5)
>>> np.einsum('...j->...', a)
array([ 10,  35,  60,  85, 110])

需要注意的几件事:

  1. 省略号运算符(>> a = reshape(0:24, [5,5]).'; >> sum(a,2).' ans = 10 35 60 85 110 )不应理解为“范围”,而应理解为“任何需要存在的地方”。
  2. ...”是指沿着相关维度自动复制数组,以便定义数学运算。自R2016b起,此功能就存在于MATLAB中(称为“隐式扩展”)。
  3. 您可能会注意到等效的MATLAB中的多个转置操作(Broadcasting)。这是因为numpy数组以行为主,而MATLAB数组以列为主。实际上,尽管基础数据具有相同的顺序,但与MATLAB相比,转置了一个numpy数组appears>”。进行了转置,以使数组在中间阶段看起来相同。

  4. 这些文档的另一个示例是:

.'

可以在MATLAB中编写如下:

>>> a = np.arange(6).reshape((3,2))
>>> b = np.arange(12).reshape((4,3))
>>> np.einsum('ki,jk->ij', a, b)
array([[10, 28, 46, 64],
       [13, 40, 67, 94]])
>>> np.einsum('ki,...k->i...', a, b)
array([[10, 28, 46, 64],
       [13, 40, 67, 94]])
>>> np.einsum('k...,jk', a, b)
array([[10, 28, 46, 64],
       [13, 40, 67, 94]])

需要注意的几件事:

  1. A = reshape(0:5, [2 3]).'; B = reshape(0:11, [3 4]).'; A.' * B.' permute(sum( permute(A, [3 1 2]) .* B,2), [3 1 2]) shiftdim(sum( shiftdim(A, -1) .* B, 2), 2) np.einsum('ki,jk->ij', a, b)时,您可以看到第np.einsum('ki,...k->i...', a, b)个维度被j替换。这两个示例中都带有一个...的事实意味着它处于显式模式。
  2. [从->转到np.einsum('ki,jk->ij', a, b)时,您可以看到现在将np.einsum('k...,jk', a, b)的尺寸替换为i。省略...只是演示隐式模式
  3. (其中输出尺寸按字母顺序排列)。
© www.soinside.com 2019 - 2024. All rights reserved.