[eigen] SparseMatrix triangularView |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
Why does the template parameter Scalar in test_case<Scalar>, not act
like 'double', when compiling
test_case<double> ?
Below you will find a bash script that demonstrates this.
When I run it on my system I get:
trash>./eigen_example.sh
g++ (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
../eigen_example
x^T = 1 2 3
We got the expected result: x^T = 1 2 3
Now change SparseMatrix<double> to SparseMatrix<Scalar> and recompile:
eigen_example.cpp: In function ‘Eigen::Matrix<Scalar, -1, 1>
test_case(Eigen::Matrix<Scalar, -1, 1>&)’:
eigen_example.cpp:13:64: error: expected primary-expression before ‘)’ token
Matrix<Scalar, Dynamic, 1> x = M.triangularView<Eigen::Lower>().solve(y);
.... snip ...
#!/bin/bash -e
eigen_prefix="$HOME/prefix/eigen"
if [ ! -e "$eigen_prefix/include/Eigen/Dense" ]
then
echo "Must set eigen_prefix to proper value for this system"
exit 1
fi
#
----------------------------------------------------------------------------
cat << EOF > eigen_example.cpp
# include <iostream>
# include <Eigen/Dense>
# include <Eigen/SparseCore>
using Eigen::Matrix;
using Eigen::Dynamic;
template <class Scalar> Matrix<Scalar, Dynamic, 1>
test_case(Matrix<Scalar, Dynamic, 1>& y)
{ int n = y.size();
Eigen::SparseMatrix<double> M(n, n);
for(int i = 0; i < n; i++)
M.insert(i, i) = Scalar(1.0);
Matrix<Scalar, Dynamic, 1> x = M.triangularView<Eigen::Lower>().solve(y);
return x;
}
int main() {
int n = 3;
Matrix<double, Dynamic, 1> y(n);
for(int i = 0; i < n; i++)
y(i) = double(i + 1);
Matrix<double, Dynamic, 1> x = test_case<double>(y);
std::cout << "x^T = " << x.transpose() << "\n";
return 0;
}
EOF
#
----------------------------------------------------------------------------
g++ --version | head -1
g++ -Wall -I$eigen_prefix/include eigen_example.cpp -o eigen_example
echo './eigen_example'
../eigen_example
echo 'We got the expected result: x^T = 1 2 3'
#
----------------------------------------------------------------------------
echo 'Now change SparseMatrix<double> to SparseMatrix<Scalar> and
recompile:'
sed -i eigen_example.cpp -e 's|SparseMatrix<double>|SparseMatrix<Scalar>|'
g++ -Wall -I$eigen_prefix/include eigen_example.cpp -o eigen_example