mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
45 lines
1.0 KiB
C++
45 lines
1.0 KiB
C++
|
|
/*
|
||
|
|
* $Id: aliasing.cc,v 1.2 2004/03/26 07:58:06 opetzold Exp $
|
||
|
|
*
|
||
|
|
* This example shows the problem with aliasing mentioned at
|
||
|
|
* http://tvmet.sourceforge.net/notes.html#alias
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include <iostream>
|
||
|
|
#include <algorithm>
|
||
|
|
#include <tvmet/Matrix.h>
|
||
|
|
#include <tvmet/util/Incrementor.h>
|
||
|
|
|
||
|
|
using std::cout; using std::endl;
|
||
|
|
using namespace tvmet;
|
||
|
|
|
||
|
|
typedef Matrix<double,3,3> matrix_type;
|
||
|
|
|
||
|
|
int main()
|
||
|
|
{
|
||
|
|
matrix_type A, B;
|
||
|
|
matrix_type C;
|
||
|
|
|
||
|
|
std::generate(A.begin(), A.end(),
|
||
|
|
tvmet::util::Incrementor<matrix_type::value_type>());
|
||
|
|
std::generate(B.begin(), B.end(),
|
||
|
|
tvmet::util::Incrementor<matrix_type::value_type>());
|
||
|
|
|
||
|
|
cout << "A = " << A << endl;
|
||
|
|
cout << "B = " << B << endl;
|
||
|
|
|
||
|
|
// matrix prod without aliasing
|
||
|
|
C = A * B;
|
||
|
|
cout << "C = A * B = " << C << endl;
|
||
|
|
|
||
|
|
// work around for aliasing
|
||
|
|
matrix_type temp_A(A);
|
||
|
|
A = temp_A * B;
|
||
|
|
cout << "matrix_type temp_A(A);\n"
|
||
|
|
<< "A = temp_A * B = " << A << endl;
|
||
|
|
|
||
|
|
// this shows the aliasing problem
|
||
|
|
A = A * B;
|
||
|
|
cout << "A = A * B = " << A << endl;
|
||
|
|
}
|