对称数组
对称数组
对称性在处理高阶张量上发挥重要作用. 物理和数学中绝大多数重要的高阶张量具有对称性,从对称惯性张量到阶数为4的刚性和曲率张量. 它们当中大多数都有转置对称性,在某些情况下,还相当复杂. Wolfram 系统实现了完整的任意阶数或者维度的张量的置换对称性的语言,并且提供了只存储关于对称性的独立分量的专门数组类型. 这常常导致存储空间显著增大,虽然通常以较慢的操作为代价,因为需要更复杂的算法. 参见 "张量对称性" 以获取对称性语言的描述.
| SymmetrizedArray | 构建只存储对称独立分量的数组 |
| SymmetrizedArrayRules | 对称数组的独立分量组成的规则列表 |
| SymmetrizedReplacePart | 在对称数组中替换独立分量 |
array = {{{18, -92, 0}, {-92, 25, 67}, {0, 67, -5}}, {{-92, 25, 67}, {25, 46, -26}, {67, -26, 27}}, {{0, 67, -5}, {67, -26, 27}, {-5, 27, -82}}};TensorSymmetry[array]Transpose[array, #] === array& /@ Permutations[{1, 2, 3}]sarray = SymmetrizedArray[array]sarray//InputFormNormal[sarray] === arraySymmetrizedArrayRules[sarray]对称数组提供了紧凑的方法来存储具有相当大对称性的数组. 特别地,反对称性最大化了这个有点. 在极端的非零情况下,在维度为
的空间中阶数为
的反对称数组具有一个独立分量. 它的稀疏表示法包含
个非零元素,而它的正则形式有
个元素. 另一种情况,对称数组的操作通常较慢,因为它需要更复杂的算法.
默认情况下,LeviCivitaTensor 提供了稀疏表示法:
lc7 = LeviCivitaTensor[7]LeviCivitaTensor 提供对称和正常表示:
lc7S = LeviCivitaTensor[7, SymmetrizedArray]lc7N = LeviCivitaTensor[7, List];lc7S//ByteCountlc7//ByteCountlc7N//ByteCountdisk = DiskMatrix[{7, 7, 7, 7, 7}];ByteCount[disk]SymmetrizedArray[disk]//ByteCountSymmetrizedArray 对象视为原子对象. 它们的信息可以使用函数访问.
AtomQ[sarray]SymmetrizedArrayRules[sarray]Dimensions[sarray]TensorSymmetry[sarray]sarray[[1, 2, 3]]sarray[[2, 3, 1]]sarray[[2]]TensorSymmetry[%]SymmetrizedReplacePart[sarray, {{3, 2, 1} -> X}]Normal[%]已经证明,SymmetrizedArray 可用于以更有效的形式重写具有对称性的正则数组. 遵循 SparseArray, SymmetrizedArray 也可以从规则列表和对称性指定构建同样有效的表示法.
反对称矩阵的 SymmetrizedArray 形式:
{{0, 1, 0}, {-1, 0, 2}, {0, -2, 0}}//SymmetrizedArrayrules = SymmetrizedArrayRules[%]SymmetrizedArray[rules, {3, 3}, Antisymmetric[{1, 2}]]Normal[%]如果不提供对称性,那么假定采用恒等对称性. 该结果与在相同规则下使用 SparseArray 等价:
SymmetrizedArray[rules, {3, 3}] == SparseArray[rules, {3, 3}]SymmetrizedArray[{{1, 1} -> x11, {1, 2} -> x12, {2, 2} -> x22}, {2, 2}, Antisymmetric[{1, 2}]]Normal[%]规则中的常见模式可以用于 SymmetrizedArray 的第一个参数中. 这些规则是只用于独立分量的规则,正如SymmetrizedIndependentComponents 给出的,并且不像 SparseArray 是用于数组的所有位置的. 特别地,这对于生成具有随机元素的对称数组很有用.
SeedRandom[0]
sarray = SymmetrizedArray[_ :> RandomInteger[10], {4, 4, 4}, Antisymmetric[{1, 2, 3}]]Normal[sarray]sarray = SymmetrizedArray[pos_ :> Subscript[x, pos], {4, 4, 4}, Antisymmetric[All]]Normal[sarray]另一种构建对称数组的方式实际上是其他数组的对称化,使用函数 Symmetrize.
Symmetrize[{{a, b}, {c, d}}]Normal[%]Symmetrize[{{a, b}, {c, d}}, Antisymmetric[{1, 2}]]Normal[%]SeedRandom[0]
aa1 = SymmetrizedArray[_ :> RandomInteger[10], {5, 5}, Antisymmetric[All]];
aa2 = SymmetrizedArray[_ :> RandomInteger[10], {5, 5}, Antisymmetric[All]];aa1aa2% === Multinomial[2, 2]Symmetrize[aa1aa2, Antisymmetric[All]]aa1aa2aa1//SymmetrizedArrayRulesSymmetrizedArray 表示法允许作用于高维度;否则,可能无法用于正常或者稀疏表示法:
SeedRandom[0]
aa1 = SymmetrizedArray[_ :> RandomInteger[10], ConstantArray[15, 6], Antisymmetric[All]];
aa2 = SymmetrizedArray[_ :> RandomInteger[10], ConstantArray[15, 8], Antisymmetric[All]];(aa12 = aa1aa2)//TimingHodgeDual[aa12]%//Normal相关指南
-
▪
- 符号张量