# Tensorlistsetitem — MindSpore Signal+ 使用手册 alpha 文档

# Tensorlistsetitem

将输入的张量（item）替换到张量列表（TensorList）中指定索引位置。该算子创建一个新的张量列表，其中在指定索引位置的张量被替换为输入的新张量，而其他位置的张量保持不变。

该算子不区分具体的数据类型，通过copy_size参数指定每个张量的数据量大小。

输入：

  - in_data - 输入张量列表指针（void**类型），指向原始张量列表中的各个张量数据。

  - in_item - 输入张量指针（void*类型），表示要替换到张量列表中的新张量数据。

  - index - 要替换的张量在列表中的索引位置（int类型）。

  - tensorlist_size - 张量列表中包含的张量个数（int类型）。

  - copy_size - 每个张量的数据量大小数组（int*类型），以字节为单位，表示每个张量需要复制的字节数。

  - core_mask - 核掩码（int类型），仅共享存储版本需要。

输出：

  - out_data - 输出张量列表指针（void**类型），存储替换操作后的张量列表，其中index位置的张量被替换为in_item。

支持平台：

  `FT78NE` `MT7004`

备注

- 该算子不区分具体的数据类型，通过copy_size参数控制复制的字节数

- 调用前需要确保out_data指向的内存空间足够大，能够存储所有张量数据

- 索引index必须在有效范围内（0 <= index < tensorlist_size）

- 算子会复制所有张量数据，输出张量列表与输入张量列表数据独立

共享存储版本：

void tensorlistsetitem_s(void **in_data, void *in_item, void **out_data, int index, int tensorlist_size, int *copy_size, int core_mask)

C调用示例（共享存储版本）：

     1#include <stdio.h>
     2#include <tensorlistsetitem.h>
     3
     4int main(int argc, char* argv[]) {
     5    // 假设在DDR空间
     6    int tensorlist_size = 3;  // 张量列表包含3个张量
     7    int index = 1;  // 替换索引为1的张量
     8
     9    // 输入张量列表
    10    float *in_tensor0 = (float *)0xA0000000;
    11    float *in_tensor1 = (float *)0xA0010000;
    12    float *in_tensor2 = (float *)0xA0020000;
    13    void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
    14
    15    // 输入item
    16    float *in_item = (float *)0xA0030000;
    17
    18    // 输出张量列表
    19    float *out_tensor0 = (float *)0xB0000000;
    20    float *out_tensor1 = (float *)0xB0010000;
    21    float *out_tensor2 = (float *)0xB0020000;
    22    void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
    23
    24    // 每个张量的数据量大小
    25    int copy_size[3] = {40, 40, 40};
    26
    27    // 核掩码
    28    int core_mask = 0xff;
    29
    30    // 调用共享存储版本的函数
    31    tensorlistsetitem_s(in_data, in_item, out_data, index, tensorlist_size, copy_size, core_mask);
    32
    33    return 0;
    34}

私有存储版本：

void tensorlistsetitem_p(void **in_data, void *in_item, void **out_data, int index, int tensorlist_size, int *copy_size)

C调用示例（私有存储版本）：

     1#include <stdio.h>
     2#include <tensorlistsetitem.h>
     3
     4int main(int argc, char* argv[]) {
     5    // 假设在L2空间
     6    int tensorlist_size = 3;  // 张量列表包含3个张量
     7    int index = 1;  // 替换索引为1的张量
     8
     9    // 输入张量列表（假设已初始化）
    10    float *in_tensor0 = (float *)0x10000000;  // 第一个张量
    11    float *in_tensor1 = (float *)0x10001000;  // 第二个张量（将被替换）
    12    float *in_tensor2 = (float *)0x10002000;  // 第三个张量
    13    void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
    14
    15    // 输入item（新张量数据）
    16    float *in_item = (float *)0x10003000;
    17
    18    // 输出张量列表（需要预先分配内存）
    19    float *out_tensor0 = (float *)0x10004000;
    20    float *out_tensor1 = (float *)0x10005000;
    21    float *out_tensor2 = (float *)0x10006000;
    22    void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
    23
    24    // 每个张量的数据量大小（假设每个张量有10个float元素，每个float 4字节）
    25    int copy_size[3] = {40, 40, 40};  // 40字节 = 10 * 4
    26
    27    // 调用私有存储版本的函数
    28    tensorlistsetitem_p(in_data, in_item, out_data, index, tensorlist_size, copy_size);
    29
    30    return 0;
    31}