用 C++ 将标量的多维向量(张量)写入文件
Write multidimensional vectors (tensors) of scalars to file in C++
我拥有的物品的描述
我的代码中有几个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}}
我想用这个对象做什么
我想将这些多维向量(基本上是张量)中的每一个保存到不同的文件中,然后我可以轻松地 load/read 例如。在 Python 中变成 numpy.array
- 用于进一步分析和可视化。我怎样才能实现这一点以在 现代 C++ 中保存这些 N 维 std::vector
中的任何一个,而无需为每个向量显式定义具有 N 嵌套循环的基本写入到 txt 函数尺寸不同?
(注意:Solutions/advice require/mention 只有标准库是首选,但我也很高兴听到任何其他答案!)
在 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 是任何 N
-“深度”向量,最终在 std::vector<double>
中将行走它自己走下坡路,并写出每个 double
.
我拥有的物品的描述
我的代码中有几个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}}
我想用这个对象做什么
我想将这些多维向量(基本上是张量)中的每一个保存到不同的文件中,然后我可以轻松地 load/read 例如。在 Python 中变成 numpy.array
- 用于进一步分析和可视化。我怎样才能实现这一点以在 现代 C++ 中保存这些 N 维 std::vector
中的任何一个,而无需为每个向量显式定义具有 N 嵌套循环的基本写入到 txt 函数尺寸不同?
(注意:Solutions/advice require/mention 只有标准库是首选,但我也很高兴听到任何其他答案!)
在 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 是任何 N
-“深度”向量,最终在 std::vector<double>
中将行走它自己走下坡路,并写出每个 double
.