张量与矩阵

在Taichi中,张量是全局变量。张量分为稀疏张量和密集张量。张量的元素可以是标量,也可以是矩阵。

注解

尽管数学上矩阵被视为2D张量,但在Taichi中, 张量矩阵 是两个完全不同的概念。 矩阵可以用作张量元素,因此你可以使每个元素都是矩阵的张量。

由标量组成的张量

  • 每个全局变量都是个N维张量。

    • 全局 标量 被视为标量的0-D张量。
  • 总是使用索引访问张量

    • 例如,如果 x 是标量3D张量,则 x[i, j, k]
    • 即使访问0-D张量 x ,也应使用 x[None] = 0 而不是 x = 0 。 请 始终 使用索引访问张量中的条目。
  • 张量元素全部会被初始化为0。

  • 稀疏张量的元素最初是全部未激活的。

  • 详情请见 Tensors of scalars

由矩阵组成的张量

张量元素也可以是矩阵。

假设你有一个名为 A128 x 64 张量,每个元素都包含一个 3 x 2 矩阵。 要分配 3 x 2 矩阵的 128 x 64 张量,请使用声明 A = ti.Matrix(3, 2, dt=ti.f32, shape=(128, 64))

  • 如果要获取网格节点 i, j 的矩阵,请使用 mat = A[i, j]mat 只是一个 3 x 2 矩阵
  • 要获取第1行第2列的矩阵元素,请用: mat[0, 1] 或者 A[i, j][0, 1]
  • 你可能已经注意到,当你从全局矩阵张量加载矩阵元素时,会有 两个 索引运算符 []:第一个用于张量索引,第二个用于矩阵索引。
  • ti.Vector 其实是 ti.Matrix 的别名。
  • 有关矩阵的更多信息,请参见 Matrices

矩阵大小

由于性能原因,矩阵运算将被展开,因此我们建议仅使用小型矩阵。 例如,2x13x34x4 矩阵还好,但 32x6 可能太大了。

警告

由于展开机制,在大型矩阵(例如 32x128 )上进行操作会导致很长的编译时间和较低的性能。

如果你的矩阵有个维度很大(比如 64),最好定义一个大小为 64 的张量。比如,声明一个 ti.Matrix(64, 32, dt=ti.f32, shape=(3, 2)) 是不合理的,可以试着用 ti.Matrix(3, 2, dt=ti.f32, shape=(64, 32)) 代替——始终把大的维度放在张量里。