Vectors¶
A vector in Taichi can have two forms:
- as a temporary local variable. An
n
component vector consists ofn
scalar values.- as an element of a global tensor. In this case, the tensor is an N-dimensional array of
n
component vectors.
In fact, Vector
is simply an alias of Matrix
, just with m = 1
. See Matrices and 张量与矩阵 for more details.
Declaration¶
As global tensors of vectors¶
-
ti.Vector.
var
(n, dt, shape = None, offset = None)¶ 参数: - n – (scalar) the number of components in the vector
- dt – (DataType) data type of the components
- shape – (optional, scalar or tuple) shape the tensor of vectors, see 张量与矩阵
- offset – (optional, scalar or tuple) see Coordinate offsets
For example, this creates a 5x4 tensor of 3 component vectors:
# Python-scope a = ti.Vector.var(3, dt=ti.f32, shape=(5, 4))
注解
In Python-scope, ti.var
declares Tensors of scalars, while ti.Vector
declares tensors of vectors.
Accessing components¶
As global tensors of vectors¶
-
a[p, q, ...][i]
参数: - a – (tensor of Vector) the vector
- p – (scalar) index of the first tensor dimension
- q – (scalar) index of the second tensor dimension
- i – (scalar) index of the vector component
This extracts the first component of vector
a[6, 3]
:x = a[6, 3][0] # or vec = a[6, 3] x = vec[0]
注解
Always use two pairs of square brackets to access scalar elements from tensors of vectors.
- The indices in the first pair of brackets locate the vector inside the tensor of vectors;
- The indices in the second pair of brackets locate the scalar element inside the vector.
For 0-D tensors of vectors, indices in the first pair of brackets should be [None]
.
As a temporary local variable¶
-
a[i]
参数: - a – (Vector) the vector
- i – (scalar) index of the component
For example, this extracts the first component of vector
a
:x = a[0]
This sets the second component of
a
to 4:a[1] = 4
TODO: add descriptions about
a(i, j)
Methods¶
-
a.
norm
(eps = 0)¶ 参数: - a – (Vector)
- eps – (optional, scalar) a safe-guard value for
sqrt
, usually 0. See the note below.
返回: (scalar) the magnitude / length / norm of vector
For example,
a = ti.Vector([3, 4]) a.norm() # sqrt(3*3 + 4*4 + 0) = 5
a.norm(eps)
is equivalent toti.sqrt(a.dot(a) + eps)
注解
Set eps = 1e-5
for example, to safe guard the operator’s gradient on zero vectors during differentiable programming.
-
a.
norm_sqr
()¶ 参数: a – (Vector) 返回: (scalar) the square of the magnitude / length / norm of vector For example,
a = ti.Vector([3, 4]) a.norm_sqr() # 3*3 + 4*4 = 25
a.norm_sqr()
is equivalent toa.dot(a)
-
a.
normalized
()¶ 参数: a – (Vector) 返回: (Vector) the normalized / unit vector of a
For example,
a = ti.Vector([3, 4]) a.normalized() # [3 / 5, 4 / 5]
a.normalized()
is equivalent toa / a.norm()
.
-
a.
dot
(b)¶ 参数: - a – (Vector)
- b – (Vector)
返回: (scalar) the dot (inner) product of
a
andb
E.g.,
a = ti.Vector([1, 3]) b = ti.Vector([2, 4]) a.dot(b) # 1*2 + 3*4 = 14
-
a.
cross
(b)¶ 参数: - a – (Vector, 2 or 3 components)
- b – (Vector of the same size as a)
返回: (scalar (for 2D inputs), or 3D Vector (for 3D inputs)) the cross product of
a
andb
We use a right-handed coordinate system. E.g.,
a = ti.Vector([1, 2, 3]) b = ti.Vector([4, 5, 6]) c = ti.cross(a, b) # c = [2*6 - 5*3, 4*3 - 1*6, 1*5 - 4*2] = [-3, 6, -3] p = ti.Vector([1, 2]) q = ti.Vector([4, 5]) r = ti.cross(a, b) # r = 1*5 - 4*2 = -3
-
a.
outer_product
(b)¶ 参数: - a – (Vector)
- b – (Vector)
返回: (Matrix) the outer product of
a
andb
E.g.,
a = ti.Vector([1, 2]) b = ti.Vector([4, 5, 6]) c = ti.outer_product(a, b) # NOTE: c[i, j] = a[i] * b[j] # c = [[1*4, 1*5, 1*6], [2*4, 2*5, 2*6]]
注解
This have no common with ti.cross
. a
and b
do not have to be 3 or 2 component vectors.
-
a.
cast
(dt)¶ 参数: - a – (Vector)
- dt – (DataType)
返回: (Vector) vector with all components of
a
casted into typedt
E.g.,
# Taichi-scope a = ti.Vector([1.6, 2.3]) a.cast(ti.i32) # [2, 3]
注解
Vectors are special matrices with only 1 column. In fact, ti.Vector
is just an alias of ti.Matrix
.