稀疏矩阵不能在ti.func中赋值吗?

文档中的代码为例,我做了一些小的改动,让A在ti.func中赋值,然后就是报错

import taichi as ti

arch = ti.cuda
ti.init(arch=arch)

n = 300
K = ti.linalg.SparseMatrixBuilder(n, n, max_num_triplets=300)
b = ti.ndarray(ti.f32, shape=n)

@ti.kernel
def fill(A: ti.types.sparse_matrix_builder(), b: ti.types.ndarray(), interval: ti.i32):
    for i in range(n):
        fill_func(i,A)
        #A[i, i] += 2.0
        if i % interval == 0:
            b[i] += 1.0
@ti.func
def fill_func(i,A):
    A[i, i] += 2.0

fill(K, b, 3)

报错如下

[Taichi] version 1.6.0, llvm 15.0.1, commit f1c6fbbd, win, python 3.9.13
[Taichi] Starting on arch=cuda
Traceback (most recent call last):
  File "c:\Users\liuyu\Desktop\gt\official_test.py", line 21, in <module>
    fill(K, b, 3)
  File "C:\Users\liuyu\anaconda3\lib\site-packages\taichi\lang\kernel_impl.py", line 976, in wrapped
    raise type(e)("\n" + str(e)) from None
taichi.lang.exception.TaichiTypeError:
File "c:\Users\liuyu\Desktop\gt\official_test.py", line 13, in fill:
        fill_func(i,A)
        ^^^^^^^^^^^^^^
File "c:\Users\liuyu\Desktop\gt\official_test.py", line 18, in fill_func:
def fill_func(i,A):
^^^^^^^^^^^^^^^^^^^
Invalid constant scalar data type: <class 'taichi.lang.kernel_arguments.SparseMatrixProxy'>

请问是ti.func就不能给稀疏矩阵赋值吗?还是我传入参数的方法有问题?

你好:wave: 是的,稀疏矩阵赋值只能在 kernel 中按照文档站说明的方式进行。可以说一下想要在 ti.func 里进行赋值操作的原因吗?

主要是在func里对我的程序更容易写,在kernel里赋值会稍微麻烦点