Stan  1.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
matrix.cpp
Go to the documentation of this file.
1 #ifndef __STAN__MATH__MATRIX_CPP__
2 #define __STAN__MATH__MATRIX_CPP__
3 
4 #include "stan/math/matrix.hpp"
6 
7 namespace stan {
8 
9  namespace math {
10 
11  double determinant(const matrix_d &m) {
12  validate_square(m,"determinant");
13  return m.determinant();
14  }
15 
16  vector_d add(const vector_d& v1, const vector_d& v2) {
17  validate_matching_dims(v1,v2,"add");
18  return v1 + v2;
19  }
20 
21  row_vector_d add(const row_vector_d& rv1, const row_vector_d& rv2) {
22  validate_matching_dims(rv1,rv2,"add");
23  return rv1 + rv2;
24  }
25 
26  matrix_d add(const matrix_d& m1, const matrix_d& m2) {
27  validate_matching_dims(m1,m2,"add");
28  return m1 + m2;
29  }
30 
31  vector_d subtract(const vector_d& v1, const vector_d& v2) {
32  validate_matching_dims(v1,v2,"subtract");
33  return v1 - v2;
34  }
35 
36  row_vector_d subtract(const row_vector_d& rv1, const row_vector_d& rv2) {
37  validate_matching_dims(rv1,rv2,"subtract");
38  return rv1 - rv2;
39  }
40 
41  matrix_d subtract(const matrix_d& m1, const matrix_d& m2) {
42  validate_matching_dims(m1,m2,"subtract");
43  return m1 - m2;
44  }
45 
46  vector_d minus(const vector_d& v) {
47  return -v;
48  }
49 
51  return -rv;
52  }
53 
54  matrix_d minus(const matrix_d& m) {
55  return -m;
56  }
57 
58  vector_d divide(const vector_d& v, double c) {
59  return v / c;
60  }
61 
62  row_vector_d divide(const row_vector_d& rv, double c) {
63  return rv / c;
64  }
65 
66  matrix_d divide(const matrix_d& m, double c) {
67  return m / c;
68  }
69 
70  vector_d elt_multiply(const vector_d& v1, const vector_d& v2) {
71  validate_matching_dims(v1,v2,"elementwise multiply");
72  vector_d prod(v1.size());
73  for (int i = 0; i < v1.size(); ++i)
74  prod(i) = v1(i) * v2(i);
75  return prod;
76  }
77 
79  validate_matching_dims(v1,v2,"elementwise multiply");
80  row_vector_d prod(v1.size());
81  for (int i = 0; i < v1.size(); ++i)
82  prod(i) = v1(i) * v2(i);
83  return prod;
84  }
85 
86  matrix_d elt_multiply(const matrix_d& m1, const matrix_d& m2) {
87  validate_matching_dims(m1,m2,"elementwise multiply");
88  matrix_d prod(m1.rows(),m1.cols());
89  for (int j = 0; j < m1.cols(); ++j)
90  for (int i = 0; i < m1.rows(); ++i)
91  prod(i,j) = m1(i,j) * m2(i,j);
92  return prod;
93  }
94 
95  vector_d elt_divide(const vector_d& v1, const vector_d& v2) {
96  validate_matching_dims(v1,v2,"elementwise divide");
97  vector_d prod(v1.size());
98  for (int i = 0; i < v1.size(); ++i)
99  prod(i) = v1(i) / v2(i);
100  return prod;
101  }
102 
104  validate_matching_dims(v1,v2,"elementwise divide");
105  row_vector_d prod(v1.size());
106  for (int i = 0; i < v1.size(); ++i)
107  prod(i) = v1(i) / v2(i);
108  return prod;
109  }
110 
111  matrix_d elt_divide(const matrix_d& m1, const matrix_d& m2) {
112  validate_matching_dims(m1,m2,"elementwise divide");
113  matrix_d prod(m1.rows(),m1.cols());
114  for (int j = 0; j < m2.cols(); ++j)
115  for (int i = 0; i < m1.rows(); ++i)
116  prod(i,j) = m1(i,j) / m2(i,j);
117  return prod;
118  }
119 
120  vector_d multiply(const vector_d& v, double c) {
121  return c * v;
122  }
123 
124  row_vector_d multiply(const row_vector_d& rv, double c) {
125  return c * rv;
126  }
127 
128  matrix_d multiply(const matrix_d& m, double c) {
129  return c * m;
130  }
131 
132  vector_d multiply(double c, const vector_d& v) {
133  return c * v;
134  }
135 
136  row_vector_d multiply(double c, const row_vector_d& rv) {
137  return c * rv;
138  }
139 
140  matrix_d multiply(double c, const matrix_d& m) {
141  return c * m;
142  }
143 
144  row_vector_d row(const matrix_d& m, size_t i) {
145  validate_row_index(m,i,"row");
146  return m.row(i - 1);
147  }
148 
149  vector_d col(const matrix_d& m, size_t j) {
150  validate_column_index(m,j,"col");
151  return m.col(j - 1);
152  }
153 
155  return m.diagonal();
156  }
157 
159  return v.asDiagonal();
160  }
161 
163  return v.transpose();
164  }
165 
167  return rv.transpose();
168  }
169 
171  return m.transpose();
172  }
173 
175  validate_square(m,"matirx inverse");
176  return m.inverse();
177  }
178 
179  vector_d
180  softmax(const vector_d& x) {
181  validate_nonzero_size(x,"vector softmax");
182  vector_d theta(x.size());
183  softmax<vector_d,double>(x,theta);
184  return theta;
185  }
186 
188  validate_square(m,"eigenvalues");
189  // false arg means no eigenvector calcs
190  Eigen::EigenSolver<matrix_d> solver(m,false);
191  // FIXME: test imag() all 0?
192  return solver.eigenvalues().real();
193  }
194 
196  validate_nonzero_size(m,"eigenvectors");
197  validate_square(m,"eigenvectors");
198  Eigen::EigenSolver<matrix_d> solver(m);
199  return solver.eigenvectors().real();
200  }
201 
202  void eigen_decompose(const matrix_d& m,
205  Eigen::EigenSolver<matrix_d> solver(m);
206  eigenvalues = solver.eigenvalues().real();
207  eigenvectors = solver.eigenvectors().real();
208  }
209 
211  validate_nonzero_size(m,"eigenvalues_sym");
212  validate_square(m,"eigenvalues_sym");
213  // FIXME: validate actually symmetric?
214  Eigen::SelfAdjointEigenSolver<matrix_d> solver(m,Eigen::EigenvaluesOnly);
215  return solver.eigenvalues().real();
216  }
217 
219  validate_nonzero_size(m,"eigenvectors_sym");
220  validate_square(m,"eigenvectors_sym");
221  Eigen::SelfAdjointEigenSolver<matrix_d> solver(m);
222  return solver.eigenvectors().real();
223  }
224 
228  Eigen::SelfAdjointEigenSolver<matrix_d> solver(m);
229  eigenvalues = solver.eigenvalues().real();
230  eigenvectors = solver.eigenvectors().real();
231  }
232 
234  validate_square(m,"cholesky decomposition");
235  Eigen::LLT<matrix_d> llt(m.rows());
236  llt.compute(m);
237  return llt.matrixL();
238  }
239 
241  Eigen::JacobiSVD<matrix_d> svd(m); // no U or V
242  return svd.singularValues();
243  }
244 
245  void svd(const matrix_d& m, matrix_d& u, matrix_d& v, vector_d& s) {
246  static const unsigned int THIN_SVD_OPTIONS
247  = Eigen::ComputeThinU | Eigen::ComputeThinV;
248  Eigen::JacobiSVD<matrix_d> svd(m, THIN_SVD_OPTIONS);
249  u = svd.matrixU();
250  v = svd.matrixV();
251  s = svd.singularValues();
252  }
253 
254  }
255 
256 }
257 
258 #endif

     [ Stan Home Page ] © 2011–2012, Stan Development Team.