张量与矩阵
在Taichi中,张量是全局变量。张量分为稀疏张量和密集张量。张量的元素可以是标量,也可以是矩阵。
注解
尽管数学上矩阵被视为2D张量,但在Taichi中, 张量 和 矩阵 是两个完全不同的概念。 矩阵可以用作张量元素,因此你可以使每个元素都是矩阵的张量。
由标量组成的张量
每个全局变量都是个N维张量。
- 全局
标量
被视为标量的0-D张量。
- 全局
总是使用索引访问张量
- 例如,如果
x
是标量3D张量,则x[i, j, k]
。 - 即使访问0-D张量
x
,也应使用x[None] = 0
而不是x = 0
。 请 始终 使用索引访问张量中的条目。
- 例如,如果
张量元素全部会被初始化为0。
稀疏张量的元素最初是全部未激活的。
详情请见 Tensors of scalars 。
由矩阵组成的张量
张量元素也可以是矩阵。
假设你有一个名为 A
的 128 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 。
矩阵大小
由于性能原因,矩阵运算将被展开,因此我们建议仅使用小型矩阵。 例如,2x1
, 3x3
, 4x4
矩阵还好,但 32x6
可能太大了。
警告
由于展开机制,在大型矩阵(例如 32x128
)上进行操作会导致很长的编译时间和较低的性能。
如果你的矩阵有个维度很大(比如 64
),最好定义一个大小为 64
的张量。比如,声明一个 ti.Matrix(64, 32, dt=ti.f32, shape=(3, 2))
是不合理的,可以试着用 ti.Matrix(3, 2, dt=ti.f32, shape=(64, 32))
代替——始终把大的维度放在张量里。