将标量的多维向量(张量)写入 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::vectors 中的任何一个而无需为每个具有不同维度的向量显式定义具有 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&lt;double&gt; 结尾的 N-"deep" 向量将自行下坡并写出每个double

【讨论】:

以上是关于将标量的多维向量(张量)写入 C++ 文件的主要内容,如果未能解决你的问题,请参考以下文章

标量向量矩阵和张量

标量向量矩阵和张量

PyTorch框架学习 — Tensor(张量)详解

动手学深度学习v2学习笔记02:线性代数矩阵计算自动求导

标量向量矩阵张量之间的区别和联系

线性代数中的各种量理解:标量向量矩阵张量