- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用Boost.MPI发送对Boost.MultiArray的2d子数组的引用。
现在,我有以下代码:
matrix_type::array_view<2>::type
current_process_batch = matrix[boost::indices[range(bias, finish_line)][range(0, width)]];
world.send(rank, BEGIN_TAG, current_process_batch);
/usr/local/include/boost/serialization/access.hpp:116:11: error: no member named 'serialize' in 'boost::detail::multi_array::multi_array_view<double, 2>'
t.serialize(ar, file_version);
最佳答案
您需要实现序列化。
这是一个通用的multi_array<T. Dims>
序列化器:
namespace boost::serialization {
template <typename Ar, typename T, size_t Dims>
void save(Ar& ar, boost::multi_array<T, Dims> const& ma, unsigned /*version*/) {
std::array<int, Dims> shape;
std::copy_n(ma.shape(), Dims, shape.begin());
ar & make_nvp("shape", shape)
& make_nvp("data", make_array(ma.data(), ma.num_elements()));
}
template <typename Ar, typename T, size_t Dims>
void load(Ar& ar, boost::multi_array<T, Dims>& ma, unsigned /*version*/) {
std::array<int, Dims> shape;
ar & make_nvp("shape", shape);
ma.resize(shape);
ar & make_nvp("data", make_array(const_cast<T*>(ma.data()), ma.num_elements()));
}
template <typename Ar, typename T, size_t Dims>
void serialize(Ar& ar, boost::multi_array<T, Dims>& ma, unsigned version) {
split_free(ar, ma, version);
}
}
auto make_multi_array() {
boost::multi_array<int, 2> ma(boost::extents[7][4]);
std::iota(ma.data(), ma.data() + ma.num_elements(), 10);
return ma;
}
int main() {
auto const original = make_multi_array();
{
std::ofstream os("array.txt");
boost::archive::text_oarchive oa(os);
oa << original;
}
std::cout << std::ifstream("array.txt").rdbuf() << "\n";
{
std::ifstream is("array.txt");
boost::archive::text_iarchive ia(is);
boost::multi_array<int, 2> restored;
ia >> restored;
assert(restored == original);
}
}
22 serialization::archive 17 0 0 0 0 2 7 4 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
Note also that
serializing the whole array could be (much) more efficient if the size difference isn't huge
the view types are not public interface for the library, i.e. it may break in future versions of Boost. If in doubt, serialize the arrays themselves
detail::multi_array::multi_array_view<...>
的支持,因为它可以反序列化INTO仅匹配形状的现有 View detail::multi_array::const_multi_array_view<...>
的支持。出于明显的原因,只能将该 View 反序列化为非const View 。 20 != 999
)。 #include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/array_wrapper.hpp>
#include <boost/multi_array.hpp>
#include <iostream>
#include <fstream>
namespace boost::serialization {
template <typename Ar, typename T, size_t Dims>
void save(Ar& ar, boost::detail::multi_array::const_multi_array_view<T, Dims> const& ma, unsigned /*version*/) {
std::array<int, Dims> shape;
std::copy_n(ma.shape(), Dims, shape.begin());
ar & make_nvp("shape", shape);
for (auto i = 0; i < shape[0]; ++i) {
for (auto j = 0; j < shape[1]; ++j) {
ar & make_nvp("item", ma[i][j]);
}
}
}
template <typename Ar, typename T, size_t Dims>
void load(Ar&, boost::detail::multi_array::const_multi_array_view<T, Dims>&, unsigned) {
static_assert(not Ar::is_loading::value, "const_multi_array_view immutable");
}
template <typename Ar, typename T, size_t Dims>
void serialize(Ar& ar, boost::detail::multi_array::const_multi_array_view<T, Dims>& ma, unsigned version) {
split_free(ar, ma, version);
}
template <typename Ar, typename T, size_t Dims>
void save(Ar& ar, boost::detail::multi_array::multi_array_view<T, Dims> const& ma, unsigned /*version*/) {
std::array<int, Dims> shape;
std::copy_n(ma.shape(), Dims, shape.begin());
ar & make_nvp("shape", shape);
for (auto i = 0; i < shape[0]; ++i) {
for (auto j = 0; j < shape[1]; ++j) {
ar & make_nvp("item", ma[i][j]);
}
}
}
template <typename Ar, typename T, size_t Dims>
void load(Ar& ar, boost::detail::multi_array::multi_array_view<T, Dims>& ma, unsigned /*version*/) {
std::array<int, Dims> shape;
ar & make_nvp("shape", shape);
if (!std::equal(begin(shape), end(shape), ma.shape()))
throw std::logic_error("multi_array_view shape mismatch");
for (auto i = 0; i < shape[0]; ++i) {
for (auto j = 0; j < shape[1]; ++j) {
ar & make_nvp("item", ma[i][j]);
}
}
}
template <typename Ar, typename T, size_t Dims>
void serialize(Ar& ar, boost::detail::multi_array::multi_array_view<T, Dims>& ma, unsigned version) {
split_free(ar, ma, version);
}
template <typename Ar, typename T, size_t Dims>
void save(Ar& ar, boost::multi_array<T, Dims> const& ma, unsigned /*version*/) {
std::array<int, Dims> shape;
std::copy_n(ma.shape(), Dims, shape.begin());
ar & make_nvp("shape", shape)
& make_nvp("data", make_array(ma.data(), ma.num_elements()));
}
template <typename Ar, typename T, size_t Dims>
void load(Ar& ar, boost::multi_array<T, Dims>& ma, unsigned /*version*/) {
std::array<int, Dims> shape;
ar & make_nvp("shape", shape);
ma.resize(shape);
ar & make_nvp("data", make_array(const_cast<T*>(ma.data()), ma.num_elements()));
}
template <typename Ar, typename T, size_t Dims>
void serialize(Ar& ar, boost::multi_array<T, Dims>& ma, unsigned version) {
split_free(ar, ma, version);
}
}
auto make_multi_array() {
boost::multi_array<int, 2> ma(boost::extents[7][4]);
std::iota(ma.data(), ma.data() + ma.num_elements(), 10);
return ma;
}
int main() {
using range = boost::multi_array_types::index_range;
auto original = make_multi_array();
auto const SLICE = boost::indices[range(1,3)][range(1,3)];
{
std::ofstream os("array.txt");
boost::archive::text_oarchive oa(os);
// only serialize initial array:
oa << original;
// modify through a sub-view
auto sub = original[SLICE];
original[2][2] = 999;
// serialize the patch
oa << sub;
auto const& const_original = original;
auto const_sub = const_original[SLICE];
oa << const_sub; // compiles
}
std::cout << std::ifstream("array.txt").rdbuf() << "\n";
{
std::ifstream is("array.txt");
boost::archive::text_iarchive ia(is);
// only deserialize initial array:
boost::multi_array<int, 2> restored;
ia >> restored;
assert(restored != original); // entry overwritten with 999
assert(restored.num_elements() == original.num_elements());
auto [o_2_2, r_2_2] = std::mismatch(
original.data(), original.data()+original.num_elements(),
restored.data());
assert(*o_2_2 == 999);
assert(*r_2_2 == 20);
// now patch in the sub array at the same sub-view:
auto sub = restored[SLICE];
ia >> sub;
// now everything is equal
assert(restored == original); // now matches!
assert(*r_2_2 == 999);
auto const& const_restored = restored;
auto const_sub = const_restored[SLICE];
//ia >> const_sub; // WON'T COMPILE
}
}
关于c++ - 如何通过Boost.MPI发送2d Boost.MultiArray的子数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62108353/
在第 6 行而不是 multiArray[0] 上,当我编写 multiArray 时,程序仍然有效。不明白为什么。我之前在想 multiArray 是一个指向 multiArray[0] 的指针,它
我有一个看起来像这样的类。目的是有一个任意的起点和终点,但运算符 [] 映射到索引 0 作为下限。 template class Vec : public std::vector { public:
这是我的第一个问题,我会尽力澄清。 我需要为位置分配一个值。我有一个 7 行的二维数组(例如)。根据别人给我的值(value),我必须改变值(value)立场。 示例如果有人给我:3。我必须将这 3
假设我有一个这样的结构: struct someDataType { boost::multi_array data; }; 然后如何初始化数组?我已经尝试过了,但它似乎不起作用: someD
我在理解 boost::multi_:array 的复制构造函数实现时遇到了问题。 当我尝试以下操作时 std::vector a; std::vector b; a.resize(12); b.re
我有一个 n 维的 Boost.MultiArray,我初始化如下: const int n=3, size=4; //# of dimensions and size of one dimensio
我目前在 JTable 中的复选框设置值时遇到问题。我需要将每个复选框的 boolean 值存储在表的行中。我可以显示默认(假)复选框,但是一旦单击复选框,就会出现异常; java.lang.Arra
我正在用 c++ 制作一个 .dll 插件并在其中嵌入 python 2.7。 在我导入大型程序之前,简单的 .py 程序一切正常。最奇怪的是程序第一次运行没问题,第二次却抛出异常: Unhandle
这是来自 Boost docs并且编译没有问题。 #include "boost/multi_array.hpp" int main () { // Create a 3D array tha
哪个更快 - 使用元素选择运算符访问多数组的元素,还是使用迭代器遍历多数组? 在我的例子中,我每次都需要对多数组的所有元素进行完整传递。 最佳答案 访问 boost::multi_array 的每个元
这里是新程序员。 我正在尝试在 Windows 命令提示符下运行脚本,但在导入 numpy 包时遇到问题,我不知道出了什么问题/如何修复它。当我在 iPython 中运行脚本时,它运行良好。但是,当我
我使用以下命令来了解我正在使用的 numpy 版本 pip show numpy 输出如下所示 --- Name: numpy Version: 1.8.2 Location: /usr/lib/py
Boost多维数组和OpenCV多维数组的最大区别是什么? 我正在用 C++ 实现一个聚类算法,并且需要一个数据结构来存储数据点。它应该能够处理不同维度的数据,例如 1D 数据(灰度图像)、3D 数据
我使用模块 PyQt4、cv2(v.2.4.13)、numpy(v.1.11.1) 等编写应用程序。我使用 Python(win32 上的 2.7.11)、Windows7(x64)。 在 Windo
我正在开发一个需要使用 2d Boost.MultiArray 的程序。我设法初始化它并用数据填充它。但我不明白如何获取大小为 i 的子数组, j如果 multiarray 的大小为 m , n .在
除了预分配和遍历所有元素之外,是否有将 2D Boost MultiArray 转换为普通 2D 数组的最佳/最简单方法? #include "boost/multi_array.hpp" #incl
当我尝试使用 Jython 调用文件及其方法时,它显示了以下错误,而我的 Numpy、Python 和 NLTK 已正确安装,并且如果我直接从 Python shell 直接运行它也能正常工作 Fil
我正在尝试运行这个程序 import cv2 import time cv.NamedWindow("camera", 1) capture = cv.CaptureFromCAM(0) while
我正在尝试在 conda 环境中运行tensorflow。我首先使用 conda create --name py27 python=2.7 创建一个 python 2.7 环境,然后将其激活。在环境
我正在使用 cPickle 将我的数据库保存到文件中。代码如下所示: def Save_DataBase(): import cPickle from scipy import * from nump
我是一名优秀的程序员,十分优秀!