| 276 | } |
| 277 | |
| 278 | TVector<double> SolveUpper(const TVector<TVector<double>>& decompositionMatrix, |
| 279 | const TVector<double>& lowerSolution) { |
| 280 | const size_t featuresCount = lowerSolution.size(); |
| 281 | |
| 282 | TVector<double> solution(featuresCount); |
| 283 | for (size_t featureNumber = featuresCount; featureNumber > 0; --featureNumber) { |
| 284 | double& solutionElement = solution[featureNumber - 1]; |
| 285 | solutionElement = lowerSolution[featureNumber - 1]; |
| 286 | |
| 287 | const TVector<double>& decompositionRow = decompositionMatrix[featureNumber - 1]; |
| 288 | for (size_t i = featureNumber; i < featuresCount; ++i) { |
| 289 | solutionElement -= solution[i] * decompositionRow[i]; |
| 290 | } |
| 291 | } |
| 292 | |
| 293 | return solution; |
| 294 | } |
| 295 | |
| 296 | TVector<double> Solve(const TVector<double>& olsMatrix, const TVector<double>& olsVector) { |
| 297 | const size_t featuresCount = olsVector.size(); |