张量与矩阵¶
在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)) 代替——始终把大的维度放在张量里。