将标量的多维向量(张量)写入 C++ 文件
Posted
技术标签:
【中文标题】将标量的多维向量(张量)写入 C++ 文件【英文标题】:Write multidimensional vectors (tensors) of scalars to file in C++ 【发布时间】:2021-03-13 23:26:07 【问题描述】:我拥有的对象的描述
我的代码中有几个 N 维容器,代表张量,其类型定义为
std::vector<std::vector<std::vector<...<double>...>>>
这些类型的数据结构有几种不同的大小和维度,它们只包含标量数字。每个向量的维数都是已知的,可以通过例如访问。 tensor::dimension
。因为它们代表张量,所以它们永远不会“不规则”:在底层,向量总是包含相同数量的元素,如下所示:
// THIS IS HOW THEY ALWAYS LOOK LIKE
T tensor = 1,2,3,4, 1,2,3,4, 1,2,3,4
// THIS IS WHAT NEVER HAPPENS
T tensor = 1,2,3, 1,2,3,4, 1,2
我想用这个对象做什么
我想将这些多维向量(基本上是张量)保存到不同的文件中,然后我可以轻松加载/读取这些文件,例如。在 Python 中输入 numpy.array
- 用于进一步分析和可视化。如何在 modern C++ 中保存这些 N 维 std::vector
s 中的任何一个而无需为每个具有不同维度的向量显式定义具有 N 个嵌套循环的基本 write-to-txt 函数?
(注意:只需要/提及标准库的解决方案/建议是首选,但我也很高兴听到任何其他答案!)
【问题讨论】:
【参考方案1】:在 C++ 中迭代某些东西的唯一方法是循环,以某种形状、物质或形式。所以不管你会有什么循环。没有变通方法或替代方案,但这并不意味着您实际上必须自己编写所有这些循环,一次一个。这就是我们在 C++ 中使用模板的原因。您正在寻找的是一个递归模板,它递归地剥离每个维度:直到最后一个为实数实现,基本上让您的编译器为您编写每个循环。任务完成。从写出普通向量的简单示例开始
void write_vec(const std::vector<double> &v)
for (const auto &value:vector)
std::cout << value << std::endl;
您希望如何保存每个值以及哪些文件的实际细节在这里无关紧要,您可以调整上述代码以使其以您认为合适的方式工作。你想让它适用于一些艺术维度。只需添加一个同名模板,然后让重载解析为您完成所有工作:
template<typename T>
void write_vec(const std::vector<std::vector<T>> &v)
for (const auto &value:vector)
write_vec(value);
现在,write_vec(anything)
,其中 anything 是任何以 std::vector<double>
结尾的 N
-"deep" 向量将自行下坡并写出每个double
。
【讨论】:
以上是关于将标量的多维向量(张量)写入 C++ 文件的主要内容,如果未能解决你的问题,请参考以下文章