36Eigen::VectorXd
TSVD(Eigen::MatrixXd A,
37 Eigen::MatrixXd b,
int filter)
39 M_Assert(b.cols() == 1,
"The b input in TSVD must have only one column");
40 Eigen::JacobiSVD<Eigen::MatrixXd> svd(A,
41 Eigen::ComputeThinU | Eigen::ComputeThinV);
42 Eigen::MatrixXd U = svd.matrixU();
43 Eigen::MatrixXd V = svd.matrixV();
44 Eigen::VectorXd x = Eigen::VectorXd::Zero(b.size());
46 for (label i = 0; i < filter; i++)
48 x += (U.col(i).dot(b.col(0)) / svd.singularValues()(i)) * (V.col(i));
54Eigen::VectorXd
TSVD(Eigen::MatrixXd A,
55 Eigen::MatrixXd b,
double noiseVariance, word parameterMethod)
59 if (parameterMethod ==
"DP")
61 Info <<
"\nRegularization parameter selected by Discrepancy principle" << endl;
62 Eigen::JacobiSVD<Eigen::MatrixXd> svd(A,
63 Eigen::ComputeThinU | Eigen::ComputeThinV);
64 Eigen::MatrixXd U = svd.matrixU();
65 Eigen::VectorXd bVect = b.col(0);
68 for (
int col = 0; col < U.cols() - 1; col++)
72 for (
int i = col + 1; i < U.cols(); i++)
74 Eigen::VectorXd tempU = U.col(i);
75 f += tempU.col(i).dot(bVect) * tempU.col(i).dot(bVect);
78 f += 2 * noiseVariance * col;
91 Info <<
"debug : f = " << f << endl;
92 Info <<
"debug : min = " << min << endl;
93 Info <<
"debug : k = " << filter << endl;
96 else if (parameterMethod ==
"UPRE")
98 Info <<
"\nRegularization parameter selected by Discrepancy principle" << endl;
102 Info <<
"Regularization parameter selection methods available are:" << endl
103 <<
"DP, UPRE" << endl;
111 Eigen::MatrixXd b,
double regularizationParameter)
113 M_Assert(b.cols() == 1,
"The b input in TSVD must have only one column");
114 Eigen::MatrixXd Anew = A.transpose() * A + regularizationParameter *
115 Eigen::MatrixXd::Identity(A.rows(), A.cols());
116 Eigen::MatrixXd bNew = A.transpose() * b;
117 Eigen::VectorXd x = A.inverse() * b;
118 Info <<
"x = \n" << x.transpose() << endl;
119 x = Anew.inverse() * bNew;
120 Info <<
"xNew = \n" << x.transpose() << endl;