Julia中张量与元素为矩阵的矩阵的爱因斯坦求和实现问题
解决Julia中Einsum宏处理嵌套矩阵索引的问题
你遇到的错误是因为@einsum宏无法解析W[a,b][c,i]这种嵌套的矩阵索引写法——它要求操作数是单一的多维张量,而非元素为子矩阵的矩阵。下面是具体的解决步骤:
1. 先将W转换为规范的多维张量
你的W本质是一个5×5×2×2的四维张量(每个位置[a,b]对应一个2×2子矩阵),所以我们需要把元素为矩阵的5×5矩阵,转换成原生的四维张量:
using Einsum # 构造原始的2×2子矩阵 S0 = reshape([2,2,4,4], (2, 2)) # 方法1:直接构造四维张量(推荐,更高效) W_tensor = repeat(S0, outer=(5,5,1,1)) # 方法2:从你原来的W结构转换 # W = reshape(Any[S0 for i in 1:25],(5,5)) # W_tensor = cat(W...; dims=(3,4)) # 将5×5的子矩阵拼接成5×5×2×2张量
2. 用规范的张量索引写爱因斯坦求和
现在W是标准的四维张量,就可以用@einsum正确实现你想要的求和逻辑——对W的第四个索引(对应子矩阵的第二个索引i)和A的第二个索引i进行求和:
# 构造你的2×2×2张量A A = reshape([1,1,1,1,3,3,3,3], (2, 2, 2)) # 执行爱因斯坦求和,对i维度求和 @einsum ans[a,b,c,d,e] := W_tensor[a,b,c,i] * A[d,i,e]
结果说明
最终的ans是一个5×5×2×2×2的五维张量,其中每个元素ans[a,b,c,d,e]等于:
$$\sum_{i=1}^2 W[a,b][c,i] \times A[d,i,e]$$
为什么原来的写法会报错?
@einsum在解析表达式时,会把W[a,b][c,i]识别成两个嵌套的索引表达式(先取W[a,b],再取其[c,i]),而宏本身只支持单一张量的多维度索引(比如W[a,b,c,i]),所以会抛出MethodError: Cannot convert an object of type Expr to an object of type Symbol的错误。
内容的提问来源于stack exchange,提问作者wayna
相关产品推荐
相关产品推荐

