ti.math.vec 和ti.types.vector的区别是什么

请问ti.math.vec 和ti.types.vector的区别是什么呢?

vec4d = ti.types.vector(4, ti.f64)  # a 64-bit floating-point 4D vector type
# vec4d  = ti.math.vec4  # a 64-bit floating-point 4D vector type

mat4x3i = ti.types.matrix(4, 3, int)  # a 4x3 integer matrix type

"""You can use these customized types to instantiate vectors and matrices"""
v = vec4d(1,2,3,4)  # Create a vector instance, here v = [1.0 2.0 3.0 4.0]

@ti.func
def length(w):  # vec4d as type hint
    return w.norm()

@ti.kernel
def test(w: vec4d): # type must be hinted
    print(length(w))
    
test(v)

(今天开始看documentation, 不太理解为什么同样是vector of 4 floating-point, 把ti.types.vector(4, ti.f32) 改成ti.math.vec4 就会报错:
“Matrix dtype f64 is not integer type or real type.”)

Hi @Amber1995 , 非常欢迎来到Taichi论坛。

我尝试了一下你的代码,并没有复现你的问题,你的Taichi是什么版本呀?

import taichi as ti
ti.init()
vec4d  = ti.math.vec4  # a 64-bit floating-point 4D vector type
v = vec4d(1,2,3,4)  # Create a vector instance, here v = [1.0 2.0 3.0 4.0]

@ti.func
def length(w):  # vec4d as type hint
    return w.norm()

@ti.kernel
def test(w: vec4d): # type must be hinted
    print(length(w))

test(v)

感谢大佬!确实是版本的问题,我之前的是version 1.1.2,update到1.1.3就成功了~ :smiling_face:

2 Likes

ti.math.vec4 是个向量类型,它其实就是 ti.types.vector(4, float).

使用 ti.types.vector 构造出来的向量类型有以下特点:

  1. 它们是类型,所以可以用作类型标注 (函数参数,返回值,结构体成员)
  2. 它们接受各种参数组合方式,vec4(x, y, z, w), vec4([x, y, z], w), vec4([x, y, z, w]), vec4(1) 这些都是可以的。
  3. 它们支持 vector swizzle 功能,比如 vec4().xyz会返回前三个分量组成的三维向量。
1 Like

Hello~ 欢迎来到 Taichi 社区~ 建议把标题加上具体的问题方便其他小伙伴搜索 :grinning: