1 #ifndef __STAN__MATH__MATRIX_HPP__
2 #define __STAN__MATH__MATRIX_HPP__
9 #include <boost/math/tools/promotion.hpp>
11 #define EIGEN_DENSEBASE_PLUGIN "stan/math/EigenDenseBaseAddons.hpp"
12 #include <Eigen/Dense>
24 template <
typename F,
typename T>
26 inline static void promote(
const F& u, T& t) {
36 inline static void promote(
const T& u, T& t) {
45 template <
typename F,
typename T>
46 struct promoter<std::vector<F>, std::vector<T> > {
47 inline static void promote(
const std::vector<F>& u,
50 for (
size_t i = 0; i < u.size(); ++i)
53 inline static std::vector<T>
62 struct promoter<std::vector<T>, std::vector<T> > {
63 inline static void promote(
const std::vector<T>& u,
67 inline static std::vector<T>
promote_to(
const std::vector<T>& u) {
73 template <
typename F,
typename T,
int R,
int C>
74 struct promoter<Eigen::Matrix<F,R,C>, Eigen::Matrix<T,R,C> > {
75 inline static void promote(
const Eigen::Matrix<F,R,C>& u,
76 Eigen::Matrix<T,R,C>& t) {
77 t.resize(u.rows(), u.cols());
78 for (
int i = 0; i < u.size(); ++i)
81 inline static Eigen::Matrix<T,R,C>
83 Eigen::Matrix<T,R,C> t;
89 template <
typename T,
int R,
int C>
90 struct promoter<Eigen::Matrix<T,R,C>, Eigen::Matrix<T,R,C> > {
91 inline static void promote(
const Eigen::Matrix<T,R,C>& u,
92 Eigen::Matrix<T,R,C>& t) {
95 inline static Eigen::Matrix<T,R,C>
promote_to(
const Eigen::Matrix<T,R,C>& u) {
100 template <
typename T1,
typename T2>
102 typedef typename boost::math::tools::promote_args<T1,T2>::type
type;
105 template <
typename T1,
typename T2>
107 typedef std::vector<typename common_type<T1,T2>::type>
type;
110 template <
typename T1,
typename T2,
int R,
int C>
111 struct common_type<Eigen::Matrix<T1,R,C>, Eigen::Matrix<T2,R,C> > {
112 typedef Eigen::Matrix<typename common_type<T1,T2>::type,R,C>
type;
115 template <
typename T1,
typename T2,
typename F>
131 template <
typename T>
135 template <
typename F>
151 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>
158 Eigen::Matrix<double,Eigen::Dynamic,1>
165 Eigen::Matrix<double,1,Eigen::Dynamic>
170 template <
typename T>
171 void resize(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& x,
172 const std::vector<size_t>& dims,
174 x.resize(dims[pos],dims[pos+1]);
177 template <
typename T>
178 void resize(Eigen::Matrix<T,Eigen::Dynamic,1>& x,
179 const std::vector<size_t>& dims,
184 template <
typename T>
185 void resize(Eigen::Matrix<T,1,Eigen::Dynamic>& x,
186 const std::vector<size_t>& dims,
193 const std::vector<size_t>& ,
198 template <
typename T>
199 void resize(std::vector<T>& x,
200 const std::vector<size_t>& dims,
204 if (pos >= dims.size())
return;
205 for (
size_t i = 0; i < x.size(); ++i)
220 template <
typename T>
221 inline void resize(T& x, std::vector<size_t> dims) {
230 void raise_range_error(
size_t max,
235 s <<
"INDEX OPERATOR [] OUT OF BOUNDS"
238 <<
"; upper bound=" << max
239 <<
"; index position=" << idx
242 throw std::out_of_range(s.str());
246 void check_range(
size_t max,
251 if (i < 1 || i > max)
252 raise_range_error(max,i,msg,idx);
272 template <
typename T>
276 const char* error_msg,
278 check_range(x.size(),i,error_msg,idx);
297 template <
typename T>
302 const char* error_msg,
304 check_range(x.size(),i1,error_msg,idx);
305 return get_base1(x[i1 - 1],i2,error_msg,idx+1);
324 template <
typename T>
326 T&
get_base1(std::vector<std::vector<std::vector<T> > >& x,
330 const char* error_msg,
332 check_range(x.size(),i1,error_msg,idx);
333 return get_base1(x[i1 - 1],i2,i3,error_msg,idx+1);
353 template <
typename T>
355 T&
get_base1(std::vector<std::vector<std::vector<std::vector<T> > > >& x,
360 const char* error_msg,
362 check_range(x.size(),i1,error_msg,idx);
363 return get_base1(x[i1 - 1],i2,i3,i4,error_msg,idx+1);
384 template <
typename T>
386 T&
get_base1(std::vector<std::vector<std::vector<std::vector<std::vector<T> > > > >& x,
392 const char* error_msg,
394 check_range(x.size(),i1,error_msg,idx);
395 return get_base1(x[i1 - 1],i2,i3,i4,i5,error_msg,idx+1);
417 template <
typename T>
419 T&
get_base1(std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<T> > > > > >& x,
426 const char* error_msg,
428 check_range(x.size(),i1,error_msg,idx);
429 return get_base1(x[i1 - 1],i2,i3,i4,i5,i6,error_msg,idx+1);
453 template <
typename T>
455 T&
get_base1(std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<T> > > > > > >& x,
463 const char* error_msg,
465 check_range(x.size(),i1,error_msg,idx);
466 return get_base1(x[i1 - 1],i2,i3,i4,i5,i6,i7,error_msg,idx+1);
491 template <
typename T>
493 T&
get_base1(std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<T> > > > > > > >& x,
502 const char* error_msg,
504 check_range(x.size(),i1,error_msg,idx);
505 return get_base1(x[i1 - 1],i2,i3,i4,i5,i6,i7,i8,error_msg,idx+1);
529 template <
typename T>
531 Eigen::Matrix<T,1,Eigen::Dynamic>
532 get_base1(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& x,
534 const char* error_msg,
536 check_range(x.rows(),m,error_msg,idx);
556 template <
typename T>
558 T&
get_base1(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& x,
561 const char* error_msg,
563 check_range(x.rows(),m,error_msg,idx);
564 check_range(x.cols(),n,error_msg,idx + 1);
565 return x(m - 1, n - 1);
582 template <
typename T>
586 const char* error_msg,
588 check_range(x.size(),m,error_msg,idx);
607 template <
typename T>
611 const char* error_msg,
613 check_range(x.size(),n,error_msg,idx);
620 template <
typename T,
int R,
int C>
623 rows(
const Eigen::Matrix<T,R,C>& m) {
626 template <
typename T,
int R,
int C>
629 cols(
const Eigen::Matrix<T,R,C>& m) {
633 template <
typename T1,
typename T2>
636 const char* x_name,
const char* y_name,
637 const char* fun_name) {
639 std::stringstream ss;
640 ss <<
"require " << x_name <<
" <= " << y_name
641 <<
" in " << fun_name
642 <<
"; found " << x_name <<
"=" << x
643 <<
", " << y_name <<
"=" << y;
644 throw std::domain_error(ss.str());
646 template <
typename T1,
typename T2>
649 const char* x_name,
const char* y_name,
650 const char* fun_name) {
652 std::stringstream ss;
653 ss <<
"require " << x_name <<
" < " << y_name
654 <<
" in " << fun_name
655 <<
"; found " << x_name <<
"=" << x
656 <<
", " << y_name <<
"=" << y;
657 throw std::domain_error(ss.str());
659 template <
typename T1,
typename T2>
662 const char* x_name,
const char* y_name,
663 const char* fun_name) {
665 std::stringstream ss;
666 ss <<
"require " << x_name <<
" >= " << y_name
667 <<
" in " << fun_name
668 <<
"; found " << x_name <<
"=" << x
669 <<
", " << y_name <<
"=" << y;
670 throw std::domain_error(ss.str());
672 template <
typename T1,
typename T2>
675 const char* x_name,
const char* y_name,
676 const char* fun_name) {
678 std::stringstream ss;
679 ss <<
"require " << x_name <<
" > " << y_name
680 <<
" in " << fun_name
681 <<
"; found " << x_name <<
"=" << x
682 <<
", " << y_name <<
"=" << y;
683 throw std::domain_error(ss.str());
688 template <
typename T,
int R,
int C>
692 if (j > 0 && j <= static_cast<size_t>(m.cols()))
return;
693 std::stringstream ss;
694 ss <<
"require 0 < column index <= number of columns in" << msg;
695 ss <<
" found cols()=" << m.cols()
696 <<
"; index j=" << j;
697 throw std::domain_error(ss.str());
700 template <
typename T,
int R,
int C>
704 if (i > 0 && i <= static_cast<size_t>(m.rows()))
return;
705 std::stringstream ss;
706 ss <<
"require 0 < row index <= number of rows in" << msg;
707 ss <<
" found rows()=" << m.rows()
708 <<
"; index i=" << i;
709 throw std::domain_error(ss.str());
712 template <
typename T,
int R,
int C>
715 if (x.rows() == x.cols())
return;
716 std::stringstream ss;
717 ss <<
"error in call to " << msg
718 <<
"; require square matrix, but found"
719 <<
" rows=" << x.rows()
720 <<
"; cols=" << x.cols();
721 throw std::domain_error(ss.str());
724 template <
typename T,
int R,
int C>
729 for (
int i = 0; i < x.rows(); ++i) {
730 for (
int j = 0; j < x.cols(); ++j) {
731 if (x(i,j) != x(j,i)) {
732 std::stringstream ss;
733 ss <<
"error in call to " << msg
734 <<
"; require symmetric matrix, but found"
735 <<
"; x[" << i <<
"," << j <<
"]=" << x(i,j)
736 <<
"; x[" << j <<
"," << i <<
"]=" << x(j,i);
737 throw std::domain_error(ss.str());
743 template <
typename T1,
int R1,
int C1,
typename T2,
int R2,
int C2>
745 const Eigen::Matrix<T2,R2,C2>& x2,
747 if (x1.rows() == x2.rows()
748 && x1.cols() == x2.cols())
return;
749 std::stringstream ss;
750 ss <<
"error in call to " << msg
751 <<
"; require matching dimensions, but found"
752 <<
" arg1(rows=" << x1.rows() <<
",cols=" << x1.cols() <<
");"
753 <<
" arg2(rows=" << x2.rows() <<
",cols=" << x2.cols() <<
")";
754 throw std::domain_error(ss.str());
757 template <
typename T1,
typename T2>
759 const std::vector<T2>& x2,
761 if (x1.size() == x2.size())
return;
762 std::stringstream ss;
763 ss <<
"error in call to " << msg
764 <<
"; require matching sizes, but found"
765 <<
" arg1(size=" << x1.size() <<
");"
766 <<
" arg2(size=" << x2.size() <<
");";
767 throw std::domain_error(ss.str());
770 template <
typename T1,
int R1,
int C1,
typename T2,
int R2,
int C2>
772 const Eigen::Matrix<T2,R2,C2>& x2,
774 if (x1.size() == x2.size())
return;
775 std::stringstream ss;
776 ss <<
"error in call to " << msg
777 <<
"; require matching sizes, but found"
778 <<
" arg1(rows=" << x1.rows() <<
",cols=" << x1.cols()
779 <<
",size=" << (x1.rows() * x1.cols()) <<
");"
780 <<
" arg2(rows=" << x2.rows() <<
",cols=" << x2.cols()
781 <<
",size=" << (x2.rows() * x2.cols()) <<
")";
782 throw std::domain_error(ss.str());
785 template <
typename T1,
int R1,
int C1,
typename T2,
int R2,
int C2>
787 const Eigen::Matrix<T2,R2,C2>& x2,
789 if (x1.cols() == x2.rows())
return;
790 std::stringstream ss;
791 ss <<
"error in call to " << msg
792 <<
"; require cols of arg1 to match rows of arg2, but found "
793 <<
" arg1 rows=" << x1.rows() <<
" arg1 cols=" << x1.cols()
794 <<
" arg2 rows=" << x2.rows() <<
" arg2 cols=" << x2.cols();
795 throw std::domain_error(ss.str());
798 template <
typename T>
800 if (x.size() > 0)
return;
801 std::stringstream ss;
802 ss <<
"require non-zero size for " << msg
803 <<
"found size=" << x.size();
804 throw std::domain_error(ss.str());
807 template <
typename T,
int R,
int C>
810 if (x.rows() == 1 || x.cols() == 1)
return;
811 std::stringstream ss;
812 ss <<
"error in " << msg
813 <<
"; require vector, found "
814 <<
" rows=" << x.rows() <<
"cols=" << x.cols();
815 throw std::domain_error(ss.str());
827 template <
typename T,
int R,
int C>
830 return m.determinant();
840 template <
typename T,
int R,
int C>
843 return m.colPivHouseholderQr().logAbsDeterminant();
854 template <
int R,
int C>
855 inline double dot_self(
const Eigen::Matrix<double, R, C>& v) {
858 for (
int i = 0; i < v.size(); ++i)
868 template<
typename T,
int R,
int C>
869 inline Eigen::Matrix<T,1,C>
871 return x.colwise().squaredNorm();
883 template<
int R1,
int C1,
int R2,
int C2>
884 inline Eigen::Matrix<double, 1, C1>
886 const Eigen::Matrix<double, R2, C2>& v2) {
888 Eigen::Matrix<double, 1, C1> ret(1,v1.cols());
890 for (j = 0; j < v1.cols(); ++j) {
891 ret(j) = v1.col(j).dot(v2.col(j));
905 template<
int R1,
int C1,
int R2,
int C2>
906 inline double dot_product(
const Eigen::Matrix<double, R1, C1>& v1,
907 const Eigen::Matrix<double, R2, C2>& v2) {
912 for (
int i = 0; i < v1.size(); ++i)
913 sum += v1[i] * v2[i];
925 for (
size_t i = 0; i <
length; i++)
926 result += v1[i] * v2[i];
936 const std::vector<double>& v2) {
948 inline int min(
const std::vector<int>& x) {
950 throw std::domain_error(
"error: cannot take min of empty int vector");
952 for (
size_t i = 1; i < x.size(); ++i)
965 template <
typename T>
966 inline T
min(
const std::vector<T>& x) {
968 return std::numeric_limits<T>::infinity();
970 for (
size_t i = 1; i < x.size(); ++i)
982 template <
typename T,
int R,
int C>
983 inline T
min(
const Eigen::Matrix<T,R,C>& m) {
985 return std::numeric_limits<double>::infinity();
999 inline int max(
const std::vector<int>& x) {
1001 throw std::domain_error(
"error: cannot take max of empty int vector");
1003 for (
size_t i = 1; i < x.size(); ++i)
1016 template <
typename T>
1017 inline T
max(
const std::vector<T>& x) {
1019 return -std::numeric_limits<T>::infinity();
1021 for (
size_t i = 1; i < x.size(); ++i)
1033 template <
typename T,
int R,
int C>
1034 inline T
max(
const Eigen::Matrix<T,R,C>& m) {
1036 return -std::numeric_limits<double>::infinity();
1037 return m.maxCoeff();
1048 template <
typename T>
1050 typename boost::math::tools::promote_args<T>::type
1054 for (
size_t i = 1; i < v.size(); ++i)
1056 return sum / v.size();
1065 template <
typename T,
int R,
int C>
1067 typename boost::math::tools::promote_args<T>::type
1068 mean(
const Eigen::Matrix<T,R,C>& m) {
1081 template <
typename T>
1083 typename boost::math::tools::promote_args<T>::type
1090 for (
size_t i = 0; i < v.size(); ++i) {
1091 T diff = v[i] - v_mean;
1092 sum_sq_diff += diff * diff;
1094 return sum_sq_diff / (v.size() - 1);
1103 template <
typename T,
int R,
int C>
1105 typename boost::math::tools::promote_args<T>::type
1110 typename boost::math::tools::promote_args<T>::type
1112 typename boost::math::tools::promote_args<T>::type
1114 for (
int i = 0; i < m.size(); ++i) {
1115 typename boost::math::tools::promote_args<T>::type
1117 sum_sq_diff += diff * diff;
1119 return sum_sq_diff / (m.size() - 1);
1128 template <
typename T>
1130 typename boost::math::tools::promote_args<T>::type
1131 sd(
const std::vector<T>& v) {
1133 if (v.size() == 1)
return 0.0;
1143 template <
typename T,
int R,
int C>
1145 typename boost::math::tools::promote_args<T>::type
1146 sd(
const Eigen::Matrix<T,R,C>& m) {
1149 if (m.size() == 1)
return 0.0;
1161 template <
typename T>
1162 inline T
sum(
const std::vector<T>& xs) {
1163 if (xs.size() == 0)
return 0;
1165 for (
size_t i = 1; i < xs.size(); ++i)
1176 template <
typename T,
int R,
int C>
1177 inline double sum(
const Eigen::Matrix<T,R,C>& v) {
1187 template <
typename T>
1188 inline T
prod(
const std::vector<T>& v) {
1189 if (v.size() == 0)
return 1;
1191 for (
size_t i = 1; i < v.size(); ++i)
1202 template <
typename T,
int R,
int C>
1203 inline T
prod(
const Eigen::Matrix<T,R,C>& v) {
1204 if (v.size() == 0)
return 1.0;
1217 template <
typename T>
1218 inline T
trace(
const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m) {
1228 template<
typename T,
int Rows,
int Cols>
1229 inline Eigen::Matrix<T,Rows,Cols>
log(
const Eigen::Matrix<T,Rows,Cols>& m) {
1230 return m.array().log().matrix();
1239 template<
typename T,
int Rows,
int Cols>
1240 inline Eigen::Matrix<T,Rows,Cols>
exp(
const Eigen::Matrix<T,Rows,Cols>& m) {
1241 return m.array().exp().matrix();
1261 template <
typename T1,
typename T2,
int R,
int C>
1263 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R,C>
1264 add(
const Eigen::Matrix<T1,R,C>& m1,
1265 const Eigen::Matrix<T2,R,C>& m2) {
1267 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R,C>
1268 result(m1.rows(),m1.cols());
1269 for (
int i = 0; i < result.size(); ++i)
1270 result(i) = m1(i) + m2(i);
1282 template <
typename T1,
typename T2,
int R,
int C>
1284 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R,C>
1285 add(
const Eigen::Matrix<T1,R,C>& m,
1287 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R,C>
1288 result(m.rows(),m.cols());
1289 for (
int i = 0; i < result.size(); ++i)
1290 result(i) = m(i) + c;
1302 template <
typename T1,
typename T2,
int R,
int C>
1304 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R,C>
1306 const Eigen::Matrix<T2,R,C>& m) {
1307 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R,C>
1308 result(m.rows(),m.cols());
1309 for (
int i = 0; i < result.size(); ++i)
1310 result(i) = c + m(i);
1328 template <
typename T1,
typename T2,
int R,
int C>
1330 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1332 const Eigen::Matrix<T2,R,C>& m2) {
1334 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1335 result(m1.rows(), m1.cols());
1336 for (
int i = 0; i < result.size(); ++i)
1337 result(i) = m1(i) - m2(i);
1341 template <
typename T1,
typename T2,
int R,
int C>
1343 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1345 const Eigen::Matrix<T2,R,C>& m) {
1347 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1348 result(m.rows(),m.cols());
1349 for (
int i = 0; i < m.size(); ++i)
1350 result(i) = c - m(i);
1353 template <
typename T1,
typename T2,
int R,
int C>
1355 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1359 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1360 result(m.rows(),m.cols());
1361 for (
int i = 0; i < m.size(); ++i)
1362 result(i) = m(i) - c;
1375 template <
typename T>
1390 template <
int R,
int C>
1392 Eigen::Matrix<double,R,C>
1410 template <
typename T1,
typename T2,
int R,
int C>
1411 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1413 const Eigen::Matrix<T2,R,C>& m2) {
1415 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1416 result(m1.rows(),m2.cols());
1417 for (
int i = 0; i < m1.size(); ++i)
1418 result(i) = m1(i) * m2(i);
1422 template <
typename T1,
typename T2,
int R1,
int C1,
int R2,
int C2>
1423 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R2, C2>
1425 const Eigen::Matrix<T2,R2,C2>& m2) {
1426 if (m1.cols() != 1 && m1.rows() != 1)
1427 throw std::domain_error(
"m1 must be a vector");
1428 if (m1.size() != m2.rows())
1429 throw std::domain_error(
"m1 must have same length as m2 has rows");
1430 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R2, C2>
1431 result(m2.rows(),m2.cols());
1432 for (
int i = 0; i < m2.rows(); ++i)
1433 for (
int j = 0; i < m2.cols(); ++j)
1434 result(i,j) = m1(i) * m2(i,j);
1438 template <
typename T1,
typename T2,
int R1,
int C1,
int R2,
int C2>
1439 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R1, C1>
1441 const Eigen::Matrix<T2,R2,C2>& m2) {
1442 if (m2.cols() != 1 && m2.rows() != 1)
1443 throw std::domain_error(
"m2 must be a vector");
1444 if (m2.size() != m1.cols())
1445 throw std::domain_error(
"m2 must have same length as m1 has columns");
1446 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R1, C1>
1447 result(m1.rows(),m1.cols());
1448 for (
int i = 0; i < m1.rows(); ++i)
1449 for (
int j = 0; j < m1.cols(); ++j)
1450 result(i,j) = m2(i) * m1(i,j);
1467 template <
typename T1,
typename T2,
int R,
int C>
1468 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1470 const Eigen::Matrix<T2,R,C>& m2) {
1472 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type, R, C>
1473 result(m1.rows(),m2.cols());
1474 for (
int i = 0; i < m1.size(); ++i)
1475 result(i) = m1(i) / m2(i);
1488 template <
int R,
int C>
1490 Eigen::Matrix<double,R,C>
1503 template <
int R,
int C>
1505 Eigen::Matrix<double,R,C>
1507 const Eigen::Matrix<double,R,C>& m) {
1522 template<
int R1,
int C1,
int R2,
int C2>
1523 inline Eigen::Matrix<double,R1,C2>
multiply(
const Eigen::Matrix<double,R1,C1>& m1,
1524 const Eigen::Matrix<double,R2,C2>& m2) {
1538 template<
int C1,
int R2>
1539 inline double multiply(
const Eigen::Matrix<double,1,C1>& rv,
1540 const Eigen::Matrix<double,R2,1>& v) {
1542 if (rv.size() != v.size())
1543 throw std::domain_error(
"rv.size() != v.size()");
1559 if (L.rows() == 1) {
1561 result(0,0) = L(0,0) * L(0,0);
1566 matrix_d L_tri = L.transpose().triangularView<Eigen::Upper>();
1567 return L.triangularView<Eigen::Lower>() * L_tri;
1581 return M * M.transpose();
1582 matrix_d result(M.rows(),M.rows());
1585 .selfadjointView<Eigen::Upper>()
1612 template <
typename T>
1614 Eigen::Matrix<T,1,Eigen::Dynamic>
1615 row(
const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m,
1618 return m.row(i - 1);
1632 template <
typename T>
1634 Eigen::Matrix<T,Eigen::Dynamic,1>
1635 col(
const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m,
1638 return m.col(j - 1);
1650 template <
typename T>
1652 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>
1653 block(
const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m,
1654 size_t i,
size_t j,
size_t nrows,
size_t ncols) {
1659 return m.block(i - 1,j - 1,nrows,ncols);
1669 template <
typename T>
1671 Eigen::Matrix<T,Eigen::Dynamic,1>
1672 diagonal(
const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m) {
1673 return m.diagonal();
1682 template <
typename T>
1684 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>
1686 return v.asDiagonal();
1689 template <
typename T,
int R,
int C>
1690 Eigen::Matrix<T,C,R>
1693 return m.transpose();
1701 template <
typename T>
1703 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>
1704 inverse(
const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m) {
1716 template <
typename T>
1718 Eigen::Matrix<T,Eigen::Dynamic,1>
1719 softmax(
const Eigen::Matrix<T,Eigen::Dynamic,1>& v) {
1722 Eigen::Matrix<T,Eigen::Dynamic,1> theta(v.size());
1724 T max_v = v.maxCoeff();
1725 for (
int i = 0; i < v.size(); ++i) {
1726 theta[i] =
exp(v[i] - max_v);
1729 for (
int i = 0; i < v.size(); ++i)
1743 template <
int TriView,
typename T1,
typename T2,
1744 int R1,
int C1,
int R2,
int C2>
1746 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,
1749 const Eigen::Matrix<T2,R2,C2> &b) {
1752 return promote_common<Eigen::Matrix<T1,R1,C1>,Eigen::Matrix<T2,R1,C1> >(A)
1753 .
template triangularView<TriView>()
1755 Eigen::Matrix<T2,R2,C2> >(b) );
1764 template<
int TriView,
typename T,
int R1,
int C1>
1766 Eigen::Matrix<T,R1,C1>
1770 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> b;
1772 A.template triangularView<TriView>().solveInPlace(b);
1775 template <
typename T1,
typename T2,
int R1,
int C1,
int R2,
int C2>
1777 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,
1780 const Eigen::Matrix<T2,R2,C2> &b) {
1788 return mdivide_left_tri<Eigen::Lower,T1,T2,R1,C1,R2,C2>(A,b);
1790 template <
typename T,
int R1,
int C1>
1792 Eigen::Matrix<T,R1,C1>
1794 Eigen::Matrix<T,R1,C1> &A) {
1801 return mdivide_left_tri<Eigen::Lower,T,R1,C1>(A);
1812 template <
typename T1,
typename T2,
int R1,
int C1,
int R2,
int C2>
1814 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R1,C2>
1816 const Eigen::Matrix<T2,R2,C2> &b) {
1819 return promote_common<Eigen::Matrix<T1,R1,C1>,
1820 Eigen::Matrix<T2,R1,C1> >(A)
1823 Eigen::Matrix<T2,R2,C2> >(b) );
1835 template <
int TriView,
typename T1,
typename T2,
1836 int R1,
int C1,
int R2,
int C2>
1838 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R1,C2>
1840 const Eigen::Matrix<T2,R2,C2> &A) {
1844 if (TriView == Eigen::Lower) {
1847 else if (TriView == Eigen::Upper) {
1851 assert(TriView == Eigen::Lower || TriView == Eigen::Upper);
1872 template <
typename T1,
typename T2,
int R1,
int C1,
int R2,
int C2>
1874 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R1,C2>
1876 const Eigen::Matrix<T2,R2,C2> &A) {
1877 return mdivide_right_tri<Eigen::Lower>
1878 (promote_common<Eigen::Matrix<T1,R1,C1>,
1879 Eigen::Matrix<T2,R1,C1> >(b),
1881 Eigen::Matrix<T2,R2,C2> >(A));
1894 template <
typename T1,
typename T2,
int R1,
int C1,
int R2,
int C2>
1896 Eigen::Matrix<typename boost::math::tools::promote_args<T1,T2>::type,R1,C2>
1898 const Eigen::Matrix<T2,R2,C2> &A) {
1922 template <
typename T>
1923 Eigen::Matrix<T,Eigen::Dynamic,1>
1927 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> >
1928 solver(m,Eigen::EigenvaluesOnly);
1929 return solver.eigenvalues();
1932 template <
typename T>
1933 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>
1937 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> >
1939 return solver.eigenvectors();
1955 template <
typename T>
1956 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>
1959 Eigen::LLT<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> >llt(m.rows());
1961 return llt.matrixL();
1972 template <
typename T>
1973 Eigen::Matrix<T,Eigen::Dynamic,1>
1975 return Eigen::JacobiSVD<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> >(m)
2008 template <
typename T>
2011 cumulative_sum(
const std::vector<T>& x) {
2012 std::vector<T> result(x.size());
2016 for (
size_t i = 1; i < result.size(); ++i)
2017 result[i] = x[i] + result[i-1];
2034 template <
typename T,
int R,
int C>
2036 Eigen::Matrix<T,R,C>
2037 cumulative_sum(
const Eigen::Matrix<T,R,C>& m) {
2038 Eigen::Matrix<T,R,C> result(m.rows(),m.cols());
2042 for (
int i = 1; i < result.size(); ++i)
2043 result(i) = m(i) + result(i-1);
2050 template <
typename T>
2051 void stan_print(std::ostream* o,
const T& x) {
2055 template <
typename T>
2056 void stan_print(std::ostream* o,
const std::vector<T>& x) {
2058 for (
int i = 0; i < x.size(); ++i) {
2059 if (i > 0) *o <<
',';
2065 template <
typename T>
2066 void stan_print(std::ostream* o,
const Eigen::Matrix<T,Eigen::Dynamic,1>& x) {
2068 for (
int i = 0; i < x.size(); ++i) {
2069 if (i > 0) *o <<
',';
2075 template <
typename T>
2076 void stan_print(std::ostream* o,
const Eigen::Matrix<T,1,Eigen::Dynamic>& x) {
2078 for (
int i = 0; i < x.size(); ++i) {
2079 if (i > 0) *o <<
',';
2085 template <
typename T>
2087 const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& x) {
2089 for (
int i = 0; i < x.rows(); ++i) {
2090 if (i > 0) *o <<
',';
2096 template <
typename T>
2099 dims(
const T& x, std::vector<int>& result) {
2102 template <
typename T,
int R,
int C>
2105 dims(
const Eigen::Matrix<T,R,C>& x,
2106 std::vector<int>& result) {
2107 result.push_back(x.rows());
2108 result.push_back(x.cols());
2110 template <
typename T>
2113 dims(
const std::vector<T>& x,
2114 std::vector<int>& result) {
2115 result.push_back(x.size());
2121 template <
typename T>
2125 std::vector<int> result;
2130 template <
typename T>
2133 size(
const std::vector<T>& x) {