123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- // Copyright 2008 Gunter Winkler <guwi17@gmx.de>
- // Thanks to Tiago Requeijo for providing this test
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #include <iostream>
- #include <boost/numeric/ublas/symmetric.hpp>
- #include <boost/numeric/ublas/triangular.hpp>
- #include <boost/cstdlib.hpp>
- using namespace std;
- namespace ublas = boost::numeric::ublas;
- int main()
- {
- int sz = 4;
- ublas::symmetric_matrix<int, ublas::upper, ublas::column_major> UpCol (sz, sz);
- ublas::symmetric_matrix<int, ublas::upper, ublas::row_major> UpRow (sz, sz);
- ublas::symmetric_matrix<int, ublas::lower, ublas::column_major> LoCol (sz, sz);
- ublas::symmetric_matrix<int, ublas::lower, ublas::row_major> LoRow (sz, sz);
- ublas::triangular_matrix<int, ublas::upper, ublas::column_major> TrUpCol (sz, sz);
- ublas::triangular_matrix<int, ublas::upper, ublas::row_major> TrUpRow (sz, sz);
- ublas::triangular_matrix<int, ublas::lower, ublas::column_major> TrLoCol (sz, sz);
- ublas::triangular_matrix<int, ublas::lower, ublas::row_major> TrLoRow (sz, sz);
- for(int i=0; i<sz; ++i)
- for(int j=i; j<sz; ++j)
- {
- // Symmetric
- UpCol(i,j) = 10*i + j;
- UpRow(i,j) = 10*i + j;
- LoCol(i,j) = 10*i + j;
- LoRow(i,j) = 10*i + j;
- // Triangular
- TrUpCol(i,j) = 10*i + j;
- TrUpRow(i,j) = 10*i + j;
- TrLoCol(j,i) = 10*i + j;
- TrLoRow(j,i) = 10*i + j;
- }
- //get pointers to data
- int* uc = &(UpCol.data()[0]);
- int* ur = &(UpRow.data()[0]);
- int* lc = &(LoCol.data()[0]);
- int* lr = &(LoRow.data()[0]);
- int* tuc = &(TrUpCol.data()[0]);
- int* tur = &(TrUpRow.data()[0]);
- int* tlc = &(TrLoCol.data()[0]);
- int* tlr = &(TrLoRow.data()[0]);
- // upper, column_major
- // storage should be: 0 1 11 2 12 22 3 13 23 33
- int uc_correct[] = {0, 1, 11, 2, 12, 22, 3, 13, 23, 33};
- // upper, row_major
- // storage should be: 0 1 2 3 11 12 13 22 23 33
- int ur_correct[] = {0, 1, 2, 3, 11, 12, 13, 22, 23, 33};
- // lower, column_major
- // storage should be: 0 1 2 3 11 12 13 22 23 33
- int lc_correct[] = {0, 1, 2, 3, 11, 12, 13, 22, 23, 33};
- // lower, row_major
- // storage should be: 0 1 11 2 12 22 3 13 23 33
- int lr_correct[] = {0, 1, 11, 2, 12, 22, 3, 13, 23, 33};
- bool success = true;
- // Test Symmetric
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(uc[i] != uc_correct[i])
- {
- cout << "Storage error (Symmetric, Upper, Column major)" << endl;
- success = false;
- break;
- }
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(ur[i] != ur_correct[i])
- {
- cout << "Storage error (Symmetric, Upper, Row major)" << endl;
- success = false;
- break;
- }
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(lc[i] != lc_correct[i])
- {
- cout << "Storage error (Symmetric, Lower, Column major)" << endl;
- success = false;
- break;
- }
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(lr[i] != lr_correct[i])
- {
- cout << "Storage error (Symmetric, Lower, Row major)" << endl;
- success = false;
- break;
- }
- // Test Triangular
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(tuc[i] != uc_correct[i])
- {
- cout << "Storage error (Triangular, Upper, Column major)" << endl;
- success = false;
- break;
- }
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(tur[i] != ur_correct[i])
- {
- cout << "Storage error (Triangular, Upper, Row major)" << endl;
- success = false;
- break;
- }
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(tlc[i] != lc_correct[i])
- {
- cout << "Storage error (Triangular, Lower, Column major)" << endl;
- success = false;
- break;
- }
- for(int i=0; i<sz*(sz+1)/2; ++i)
- if(tlr[i] != lr_correct[i])
- {
- cout << "Storage error (Triangular, Lower, Row major)" << endl;
- success = false;
- break;
- }
- return (success)?boost::exit_success:boost::exit_failure;
- }
|