compressed2d_inserter.cpp
来自「矩阵运算源码最新版本」· C++ 代码 · 共 108 行
CPP
108 行
// Software License for MTL// // Copyright (c) 2007 The Trustees of Indiana University. All rights reserved.// Authors: Peter Gottschling and Andrew Lumsdaine// // This file is part of the Matrix Template Library// // See also license.mtl.txt in the distribution.#include <iostream>#include <boost/test/minimal.hpp>#include <boost/type_traits.hpp>#include <boost/numeric/mtl/utility/tag.hpp>#include <boost/numeric/mtl/matrix/compressed2D.hpp>#include <boost/numeric/mtl/matrix/transposed_view.hpp>#include <boost/numeric/mtl/matrix/parameter.hpp>#include <boost/numeric/mtl/utility/range_generator.hpp>#include <boost/numeric/mtl/utility/glas_tag.hpp>#include <boost/numeric/mtl/detail/index.hpp>#include <boost/numeric/mtl/utility/maybe.hpp>#include <boost/numeric/mtl/operation/raw_copy.hpp>#include <boost/numeric/mtl/operation/update.hpp>#include <boost/numeric/mtl/operation/print_matrix.hpp>using namespace mtl;using namespace std;template <typename Matrix>void raw_copy_test(Matrix& matrix, row_major){ size_t sts[] = {0, 2, 3, 7, 9, 12, 16, 16, 18}, ind[] = {1, 4, 2, 0, 1, 2, 3, 3, 5, 1, 3, 4, 1, 3, 4, 5, 2, 5}; int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}; // Compiler warning on out of range access can be ignored, past-the-end address is intended matrix.raw_copy(val, val+18, sts, ind);}template <typename Matrix>void raw_copy_test(Matrix& matrix, col_major){ size_t sts[] = {0, 1, 5, 8, 12, 15, 18}, ind[] = {2, 0, 2, 4, 5, 1, 2, 7, 2, 3, 4, 5, 0, 4, 5, 3, 5, 7}; int val[] = {4, 1, 5, 10, 13, 3, 6, 17, 7, 8, 11, 14, 2, 12, 15, 9, 16, 18}; // Compiler warning on out of range access can be ignored, past-the-end address is intended matrix.raw_copy(val, val+18, sts, ind);}template <typename Orientation, typename Indexing>void test_compressed2D_insertion(){ typedef matrix::parameters<Orientation, Indexing, fixed::dimensions<8, 6> > parameters; typedef compressed2D<int, parameters> matrix_type; matrix_type matrix; const int io= mtl::index::change_to(Indexing(), 0); // index offset 1 for Fortran, 0 for C raw_copy_test(matrix, Orientation()); print_matrix(matrix); if (matrix(1+io, 3+io) != 0) throw "Error in raw_copy, should be empty"; if (matrix(2+io, 3+io) != 7) throw "Error in raw_copy, should be 7"; { // Inserter that overwrites the old values compressed2D_inserter<int, parameters> i1(matrix, 3); i1(0+io, 3+io) << 31; i1(3+io, 3+io) << 33; i1(6+io, 0+io) << 34 << 35; i1(4+io, 4+io) << 36 << 37; } cout << "\n\n"; print_matrix(matrix); if (matrix(0+io, 3+io) != 31) throw "Error overwriting empty value"; if (matrix(3+io, 3+io) != 33) throw "Error overwriting existing value"; if (matrix(6+io, 0+io) != 35) throw "Error overwriting empty value twice"; if (matrix(4+io, 4+io) != 37) throw "Error overwriting existing value twice"; { // Inserter that adds to the old values compressed2D_inserter<int, parameters, operations::update_plus<int> > i2(matrix, 3); i2(2+io, 2+io) << 21; i2(2+io, 4+io) << 22; i2(6+io, 1+io) << 23; i2(7+io, 2+io) << 24 << 2; i2(4+io, 2+io) << 25; i2(2+io, 5+io) << 26; i2(0+io, 2+io) << 27; i2(3+io, 1+io) << 28; i2(4+io, 2+io) << 29; } cout << "\n\n"; print_matrix(matrix); if (matrix(0+io, 2+io) != 27) throw "Error adding to empty value"; if (matrix(2+io, 2+io) != 27) throw "Error adding to existing value"; if (matrix(4+io, 2+io) != 54) throw "Error adding to existing value twice (in 2 statements)"; if (matrix(7+io, 2+io) != 43) throw "Error adding to existing value twice (in 1 statement)"; cout << "\n\n"; { matrix::inserter<matrix_type, operations::update_plus<int> > i3(matrix, 7); i3(2+io, 2+io) << 1; } if (matrix(2+io, 2+io) != 28) throw "Error adding to existing value"; cout << "\nmatrix[2][2] = " << matrix[2+io][2+io] << "\n";} int test_main(int argc, char* argv[]){ test_compressed2D_insertion<row_major, mtl::index::c_index>(); test_compressed2D_insertion<col_major, mtl::index::c_index>(); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?