矩阵

  • ti.Matrix 只适用于小矩阵(如3x3)。如果要使用 64x64 的矩阵,你可以用标量构成的二维张量。
  • ti.Vectorti.Matrix 相同,只不过它只有一列。
  • 注意区分逐元素的乘法 * 和矩阵乘法 @
  • ti.Vector(n, dt=ti.f32)ti.Matrix(n, m, dt=ti.f32) 用来创建向量/矩阵构成的张量。
  • A.transpose()
  • R, S = ti.polar_decompose(A, ti.f32)
  • U, sigma, V = ti.svd(A, ti.f32) (其中 sigma 是一个 3x3 矩阵)
  • ``any(A)``(仅 Taichi 作用域)
  • ``all(A)``(仅 Taichi 作用域)

TODO: doc here better like Vector. WIP

Taichi中的矩阵有两种形式:

  • 作为临时局部变量。一个由 n*m 个标量构成的 n×m 阶矩阵。
  • 作为全局张量的一个成员。在这种情况下, 张量是一个由 n×m 阶矩阵构成的N-维的数组。

定义

作为全局张量的矩阵

ti.Matrix.``var(n, m, dt, shape = None, offset = None)

参数:
  • n – (标量)矩阵的行数
  • m – (标量)矩阵的列数
  • dt – (数据类型)元素的数据类型
  • shape – (可选,标量或元组)向量张量的形状,见 张量与矩阵
  • offset – (可选,标量或元组)请参见 Coordinate offsets

例如, 以下创建了一个由 3x3 矩阵构成的 5x4 的张量:

  1. # Python-scope
  2. a = ti.Matrix.var(3, 3, dt=ti.f32, shape=(5, 4))

注解

在 Python-scope 中, ti.var 声明了 Tensors of scalars , ti.Matrix 声明了由矩阵组成的张量。

作为一个临时的本地变量

ti.``Matrix([[x, y, ][, z, w, ], ])

参数:
  • x – (标量)第一行第一个元素
  • y – (标量)第一行第二个元素
  • z – (标量)第二行第一个元素
  • w – (标量)第二行第二个元素

例如,下述将创建一个 2x3 的矩阵,第一行中的分量为 (2, 3, 4) ,第二行的为 (5, 6, 7) 中:

  1. # Taichi-scope
  2. a = ti.Matrix([[2, 3, 4], [5, 6, 7]])

ti.Matrix.``rows([v0, v1, v2, ])

ti.Matrix.``cols([v0, v1, v2, ])

参数:
  • v0 – (向量)组成第一行(列)元素的向量
  • v1 – (向量)组成第二行(列)元素的向量
  • v2 – (向量)组成第三行(列)元素的向量

例如,以下代码创建了一个 3x3 矩阵,矩阵的行(列)是由向量拼接构成的:

  1. # Taichi 作用域
  2. v0 = ti.Vector([1.0, 2.0, 3.0])
  3. v1 = ti.Vector([4.0, 5.0, 6.0])
  4. v2 = ti.Vector([7.0, 8.0, 9.0])
  5. # 指定行中的数据
  6. a = ti.Matrix.rows([v0, v1, v2])
  7. # 指定列中的数据
  8. a = ti.Matrix.cols([v0, v1, v2])
  9. # 可以用列表代替参数中的向量
  10. a = ti.Matrix.rows([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]])

元素访问

作为全局的由向量构成的张量

a[p, q, ...][i, j]

参数:
  • a – (矩阵构成的张量)张量名
  • p – (标量)张量的第一维的索引
  • q – (标量)张量的第二维的索引
  • i – (标量)矩阵的行索引
  • j – (标量)矩阵的列索引

以下代码用以访问矩阵 a[6,3] 的第一个元素:

  1. x = a[6, 3][0, 0]
  2. # 或者
  3. mat = a[6, 3]
  4. x = mat[0, 0]

注解

访问矩阵形式张量中的标量元素时, 必须 使用两对方括号。

  • 第一对方括号中的索引定位张量中的矩阵;
  • 第二对方括号中的索引定位矩阵中的标量元素。

对于0维的矩阵形式的张量,第一对方括号中的索引应该为 [None]

作为一个临时的本地变量

a[i, j]

参数:
  • a – (矩阵)该矩阵本身
  • i – (标量)矩阵的行索引
  • j – (标量)矩阵的列索引

比如,访问矩阵 a 第0行第1列的元素:

  1. x = a[0, 1]

a 第1行第3列的元素设置为4:

  1. a[1, 3] = 4

方法

a.``transpose()

参数:a – (矩阵)该矩阵本身
返回:(矩阵) a 的转置矩阵 。

例如:

  1. a = ti.Matrix([[2, 3], [4, 5]])
  2. b = a.transpose()
  3. # 现在 b = ti.Matrix([[2, 4], [3, 5]])

注解

a.transpose() 不会影响 a 中的数据,它只是返回结果。

a.``trace()

参数:a – (矩阵)该矩阵本身
返回:(标量) a 矩阵的迹。

返回值可以计算为 a[0, 0] + a[1, 1] + ...

a.``determinant()

参数:a – (矩阵)该矩阵本身
返回:(标量) a 矩阵的行列式。

注解

目前用于此函数的矩阵大小必须为 1x1、2x2、3x3 或 4x4。

此函数目前仅在 Taichi 作用域内有效。

a.``inverse()

参数:a – (矩阵)该矩阵本身
返回:(矩阵) a 的逆矩阵。

注解

目前用于此函数的矩阵大小必须为 1x1、2x2、3x3 或 4x4。

此函数目前仅在 Taichi 作用域内有效。