You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何一次性访问boost circular buffer全部元素并写入指定shape的张量

解决方案

你需要根据是否可以修改缓冲区的类型定义,选择对应的实现方案:

方案1:可修改缓冲区定义(支持真正的一次性写入)

因为你存储的每个元素长度固定为30,建议将元素类型从std::vector<float>替换为std::array<float, 30>,替换后boost::circular_buffer内的所有浮点数据会连续存储,可直接通过内存映射实现一次性写入张量,以下以常用的PyTorch C++ API(LibTorch)为例:

#include <boost/circular_buffer.hpp>
#include <array>
#include <torch/torch.h>

// 修改后的缓冲区定义
boost::circular_buffer<std::array<float, 30>> poses {20};

// 写入张量逻辑
if (poses.full()) { // 确认缓冲区已填满20个元素
    torch::Tensor tensor = torch::from_blob(
        poses.array_one().first, // 取环形缓冲区连续存储段的首地址
        {1, 20, 30},
        torch::kFloat32
    ).clone(); // 若不需要脱离缓冲区生命周期持有张量数据,可删除clone()减少一次拷贝
}

如果使用其他张量库(如TensorFlow C++、Eigen Tensor),逻辑完全一致:直接把环形缓冲区的连续内存地址映射到张量结构即可。

方案2:不可修改缓冲区定义

如果必须保留std::vector<float>作为元素类型,由于每个std::vector的底层数据存储在独立的堆内存上,无法直接一次性批量拷贝所有数据,可通过以下最高效的批量拷贝实现:

#include <boost/circular_buffer.hpp>
#include <vector>
#include <algorithm>
#include <torch/torch.h>

boost::circular_buffer<std::vector<float>> poses {20};

// 初始化目标张量
torch::Tensor tensor = torch::empty({1, 20, 30}, torch::kFloat32);
float* tensor_data = tensor.data_ptr<float>();

// 批量拷贝每个vector的数据到张量对应偏移位置
for (size_t i = 0; i < poses.size(); ++i) {
    std::copy(poses[i].begin(), poses[i].end(), tensor_data + i * 30);
}

内容的提问来源于stack exchange,提问作者Baddela yogitha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:39:02