Julia中的张量模n积

Julia中的张量模n积,julia,Julia,我需要张量模n积。 这里可以看到Tensr模n积的定义。 我找到了python代码。 我想把这段代码转换成julia def mode_n_product(x, m, mode): x = np.asarray(x) m = np.asarray(m) if mode <= 0 or mode % 1 != 0: raise ValueError('`mode` must be a positive interger') if x.ndim <

我需要张量模n积。 这里可以看到Tensr模n积的定义。

我找到了python代码。 我想把这段代码转换成julia

def mode_n_product(x, m, mode):
   x = np.asarray(x)
   m = np.asarray(m)
   if mode <= 0 or mode % 1 != 0:
       raise ValueError('`mode` must be a positive interger')
   if x.ndim < mode:
       raise ValueError('Invalid shape of X for mode = {}: {}'.format(mode, x.shape))
   if m.ndim != 2:
       raise ValueError('Invalid shape of M: {}'.format(m.shape))
   return np.swapaxes(np.swapaxes(x, mode - 1, -1).dot(m.T), mode - 1, -1)
一种方法是:

using TensorOperations
@tensor y[i1, i2, i3, out, i5] := x[i1, i2, i3, s, i5] * a[out, s]
这是你链接中给出的定义这个的公式,只是我将求和索引的名称改为
s
;你可以选择任何你喜欢的索引名,它们只是标记。总和是隐式的,因为
s
不显示在左侧

将索引
放回原来的位置没有什么特别之处。与python代码一样,
@tensor
排列
x
的维度以使用普通矩阵乘法,然后再次排列以给出所需的
y
顺序。所需的排列越少,速度就越快

或者,您可以尝试使用循环向量化,Tullio@tullio y[i1,i2,…
使用相同的符号。它不需要为了调用库矩阵乘法函数而进行排列,而是编写一个纯Julia版本,在数组到达时与数组一起工作。

一种方法是:

using TensorOperations
@tensor y[i1, i2, i3, out, i5] := x[i1, i2, i3, s, i5] * a[out, s]
这是你链接中给出的定义这个的公式,除了我将求和索引的名称改为
s
;你可以选择任何你喜欢的索引名称,它们只是标记。求和是隐式的,因为
s
不会出现在左边

将索引
放回原来的位置没有什么特别的。与python代码一样,
@tensor
排列
x
的维度,以便使用普通矩阵乘法,然后再次排列以给出所需的顺序。所需的排列越少,速度越快我会的

或者,您可以尝试
使用循环向量化,Tullio;@Tullio y[i1,i2,…
使用相同的符号。这不是为了调用库矩阵乘法函数而进行排列,而是编写一个纯Julia版本,在数组到达时使用它