44Eigen::MatrixXd
rand(label rows, label cols,
double min,
47 std::srand(
static_cast<long unsigned int>
48 (std::chrono::high_resolution_clock::now().time_since_epoch().count()));
49 Eigen::MatrixXd matr = Eigen::MatrixXd::Random(rows, cols);
50 matr = (matr.array() + 1) / 2;
51 matr = matr.array() * (max - min);
52 matr = matr.array() + min;
56Eigen::MatrixXd
rand(label rows, Eigen::MatrixXd minMax)
58 std::srand(
static_cast<long unsigned int>
59 (std::chrono::high_resolution_clock::now().time_since_epoch().count()));
60 label cols = minMax.rows();
61 Eigen::MatrixXd matr = Eigen::MatrixXd::Random(rows, cols);
62 matr = (matr.array() + 1) / 2;
64 for (label i = 0; i < cols; i++)
66 matr.col(i) = matr.col(i).array() * (minMax(i, 1) - minMax(i, 0));
67 matr.col(i) = matr.col(i).array() + (minMax(i, 0));
141 Eigen::JacobiSVD<Eigen::MatrixXd> svd_holder(origin,
142 Eigen::ComputeThinU | Eigen::ComputeThinV);
144 Eigen::MatrixXd U = svd_holder.matrixU();
145 Eigen::MatrixXd V = svd_holder.matrixV();
146 Eigen::MatrixXd D = svd_holder.singularValues();
148 Eigen::MatrixXd S(V.cols(), U.cols());
151 for (
unsigned int i = 0; i < D.size(); ++i)
155 S(i, i) = 1 / D(i, 0);
163 return V * S * U.transpose();
168 const word inversionMethod)
170 Info <<
"Inversion method : " << inversionMethod << endl;
172 if (inversionMethod ==
"pinv_eigen_based")
176 else if (inversionMethod ==
"direct")
178 return matrixToInvert.inverse();
180 else if (inversionMethod ==
"fullPivLu")
182 return matrixToInvert.fullPivLu().inverse();
184 else if (inversionMethod ==
"partialPivLu")
186 return matrixToInvert.partialPivLu().inverse();
188 else if (inversionMethod ==
"householderQr")
190 return matrixToInvert.householderQr().solve(Eigen::MatrixXd::Identity(
191 matrixToInvert.rows(), matrixToInvert.cols()));
193 else if (inversionMethod ==
"colPivHouseholderQr")
195 return matrixToInvert.colPivHouseholderQr().inverse();
197 else if (inversionMethod ==
"fullPivHouseholderQr")
199 return matrixToInvert.fullPivHouseholderQr().inverse();
201 else if (inversionMethod ==
"completeOrthogonalDecomposition")
203 return matrixToInvert.completeOrthogonalDecomposition().pseudoInverse();
205 else if (inversionMethod ==
"jacobiSvd")
207 return matrixToInvert.jacobiSvd(Eigen::ComputeThinU |
208 Eigen::ComputeThinV).solve(Eigen::MatrixXd::Identity(matrixToInvert.rows(),
209 matrixToInvert.cols()));
211 else if (inversionMethod ==
"llt")
213 return matrixToInvert.llt().solve(Eigen::MatrixXd::Identity(
214 matrixToInvert.rows(), matrixToInvert.cols()));
216 else if (inversionMethod ==
"ldlt")
218 Eigen::LLT<Eigen::MatrixXd> lltOfA(matrixToInvert);
219 return lltOfA.solve(Eigen::MatrixXd::Identity(matrixToInvert.rows(),
220 matrixToInvert.cols()));
222 else if (inversionMethod ==
"bdcSvd")
224 return matrixToInvert.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(
225 Eigen::MatrixXd::Identity(matrixToInvert.rows(), matrixToInvert.cols()));
229 Info <<
"Unkwown inversion method, solving with : completeOrthogonalDecomposition"
231 return matrixToInvert.completeOrthogonalDecomposition().pseudoInverse();
Eigen::MatrixXd pinv_eigen_based(Eigen::MatrixXd &origin, const float er)
Using the Eigen library, using the SVD decomposition method to solve the matrix pseudo-inverse,...
Eigen::MatrixXd rand(label rows, label cols, double min, double max)
Generates random matrix with random values in an interval.