cisst-saw
Loading...
Searching...
No Matches
nmrLSqLin.h
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3
4/*
5 Author(s): Ankur Kapoor
6 Created on: 2005-10-18
7
8 (C) Copyright 2005-2018 Johns Hopkins University (JHU), All Rights Reserved.
9
10--- begin cisst license - do not edit ---
11
12This software is provided "as is" under an open source license, with
13no warranty. The complete license can be found in license.txt and
14http://www.cisst.org/cisst/license.txt.
15
16--- end cisst license ---
17*/
18
19
24
25
26#ifndef _nmrLSqLin_h
27#define _nmrLSqLin_h
28
29#include <algorithm>
34
35// Always include last
37
105
106/*
107 ****************************************************************************
108 DYNAMIC SIZE
109 ****************************************************************************
110 */
111
115protected:
139
154
155 /* Just store Ma, Me, Mg, and N, which are needed
156 to check if A matrix passed to solve method matches
157 the allocated size.
158 For LS problem Me == 0 and Mg ==0
159 For LSI problem Me == 0
160 Otherwise LSEI problem
161 */
162 size_t m_Ma;
163 size_t m_Me;
164 size_t m_Mg;
165 size_t m_N;
166
167public:
172
173 static inline CISSTNETLIB_INTEGER GetWorkspaceSize(size_t ma, size_t me, size_t mg, size_t n)
174 {
175 CISSTNETLIB_INTEGER lwork;
176 if ((me == 0) && (mg ==0)) { // case LS (dgels)
177 // Following produces same result as QueryWorkspaceSize_LS().
178 CISSTNETLIB_INTEGER minmn = static_cast<CISSTNETLIB_INTEGER>(std::max(std::min(ma,n),static_cast<size_t>(1)));
179 lwork = 2*minmn;
180 } else if (me == 0) { // case LSI
181 size_t k = std::max(ma+mg,n);
182 lwork = static_cast<CISSTNETLIB_INTEGER>(k+n+(mg+2)*(n+7));
183 } else { // case LSEI
184 size_t k = std::max(ma+mg,n);
185 lwork = static_cast<CISSTNETLIB_INTEGER>(2*(me+n)+k+(mg+2)*(n+7));
186 }
187 return lwork;
188 }
189
190 static inline CISSTNETLIB_INTEGER GetIWorkspaceSize(size_t CMN_UNUSED(ma), size_t me, size_t mg, size_t n)
191 {
192 if ((me == 0) && (mg ==0)) { // case LS
193 return 0;
194 } else if (me == 0) { // case LSI
195 return static_cast<CISSTNETLIB_INTEGER>(mg+2*n+1);
196 } else { // case LSEI
197 return static_cast<CISSTNETLIB_INTEGER>(mg+2*n+2);
198 }
199 }
200
203 static CISSTNETLIB_INTEGER QueryWorkspaceSize_LS(size_t ma, size_t n)
204 {
205 // @see http://www.netlib.org/clapack/CLAPACK-3.1.1/SRC/dgels.c
206 // ma = rows of matrix A, aka M
207 // n = cols of matrix A, aka N
208 char trans = 'N';
209 CISSTNETLIB_INTEGER Mrows = static_cast<CISSTNETLIB_INTEGER>(ma);
210 CISSTNETLIB_INTEGER Ncols = static_cast<CISSTNETLIB_INTEGER>(n);
211 CISSTNETLIB_INTEGER nrhs = 1;
212 CISSTNETLIB_INTEGER lda = static_cast<CISSTNETLIB_INTEGER>(std::max(ma,static_cast<size_t>(1)));
213 CISSTNETLIB_INTEGER ldb = static_cast<CISSTNETLIB_INTEGER>(std::max(std::max(static_cast<size_t>(1),ma),n));
214 CISSTNETLIB_INTEGER lwork = -1; // calculate what lwork should be
215 CISSTNETLIB_INTEGER info;
216 CISSTNETLIB_DOUBLE work;
217
218#if defined(CISSTNETLIB_VERSION_MAJOR)
219#if (CISSTNETLIB_VERSION_MAJOR >= 3)
220 cisstNetlib_dgels_(&trans, &Mrows, &Ncols, &nrhs,
221 0, &lda,
222 0, &ldb,
223 &work, &lwork, &info);
224#endif
225#else // no major version
226 dgels_(&trans, &Mrows, &Ncols, &nrhs,
227 0, &lda,
228 0, &ldb,
229 &work, &lwork, &info);
230#endif // CISSTNETLIB_VERSION
231 CMN_ASSERT(info == 0);
232 // optimal work array size lwork is stored in first entry of work array
233 return static_cast<CISSTNETLIB_INTEGER>(work);
234 }
235
239 template <typename _matrixOwnerTypeA>
241 {
242 return nmrLSqLinSolutionDynamic::GetWorkspaceSize(inA.rows(), 0, 0, inA.cols());
243 }
244
247 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG>
253 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG>
259
262 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE, typename _matrixOwnerTypeG>
269 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE, typename _matrixOwnerTypeG>
276
282 static inline void AllocateWorkspace(CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n, vctDynamicVector<CISSTNETLIB_DOUBLE> &inWork)
283 {
284 inWork.SetSize(nmrLSqLinSolutionDynamic::GetWorkspaceSize(ma,me,mg,n));
285 }
286 static inline void AllocateIWorkspace(CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n, vctDynamicVector<CISSTNETLIB_INTEGER> &inIWork)
287 {
288 inIWork.SetSize(nmrLSqLinSolutionDynamic::GetIWorkspaceSize(ma,me,mg,n));
289 }
290
295 template <typename _matrixOwnerTypeA>
300
305 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG>
312 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG>
319
324 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE, typename _matrixOwnerTypeG>
332 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE, typename _matrixOwnerTypeG>
340
353 class Friend {
354 private:
355 nmrLSqLinSolutionDynamic &solution;
356 public:
357 Friend(nmrLSqLinSolutionDynamic &insolution):solution(insolution) {
358 }
360 return solution.A;
361 }
363 return solution.E;
364 }
366 return solution.G;
367 }
369 return solution.b;
370 }
372 return solution.f;
373 }
375 return solution.h;
376 }
378 return solution.X;
379 }
381 return solution.RNorm;
382 }
384 return solution.InputMemory;
385 }
387 return solution.Work;
388 }
390 return solution.IWork;
391 }
392 inline CISSTNETLIB_INTEGER GetMa(void) {
393 return static_cast<CISSTNETLIB_INTEGER>(solution.m_Ma);
394 }
395 inline CISSTNETLIB_INTEGER GetMe(void) {
396 return static_cast<CISSTNETLIB_INTEGER>(solution.m_Me);
397 }
398 inline CISSTNETLIB_INTEGER GetMg(void) {
399 return static_cast<CISSTNETLIB_INTEGER>(solution.m_Mg);
400 }
401 inline CISSTNETLIB_INTEGER GetN(void) {
402 return static_cast<CISSTNETLIB_INTEGER>(solution.m_N);
403 }
404 };
405 friend class Friend;
406
414 m_Ma(0),
415 m_Me(0),
416 m_Mg(0),
417 m_N(0) {};
418
420 nmrLSqLinSolutionDynamic(size_t ma, size_t n)
421 {
422 this->Allocate(ma, 0, 0, n);
423 }
424
425 nmrLSqLinSolutionDynamic(size_t ma, size_t mg, size_t n)
426 {
427 this->Allocate(ma, 0, mg, n);
428 }
429
430 nmrLSqLinSolutionDynamic(size_t ma, size_t me, size_t mg, size_t n)
431 {
432 this->Allocate(ma, me, mg, n);
433 }
434
435 /************************************************************************/
436 /* The following are various constructors for the LS problem */
437 /************************************************************************/
438
446 template <typename _matrixOwnerTypeA>
451
460 template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeWork>
466
475 template <typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork>
482
494 template <typename _vectorOwnerTypeX>
495 nmrLSqLinSolutionDynamic(size_t ma, size_t n,
497 {
498 this->SetRef(ma, 0, 0, n, inX);
499 }
500
509 template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork>
516
517 /************************************************************************/
518 /* The following are various constructors for the LSI problem */
519 /************************************************************************/
520
528 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG>
534
543 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG,
544 typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
552
561 template <typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
569
581 template <typename _vectorOwnerTypeX>
582 nmrLSqLinSolutionDynamic(size_t ma, size_t mg, size_t n,
584 {
585 this->SetRef(ma, 0, mg, n, inX);
586 }
587
596 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG,
597 typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork,
598 typename _vectorOwnerTypeIWork>
607
608 /************************************************************************/
609 /* The following are various constructors for LSEI problem */
610 /************************************************************************/
611
619 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE, typename _matrixOwnerTypeG>
626
636 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE,
637 typename _matrixOwnerTypeG, typename _vectorOwnerTypeWork,
638 typename _vectorOwnerTypeIWork>
647
656 template <typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
657 nmrLSqLinSolutionDynamic(size_t ma, size_t me, size_t mg, size_t n,
661 {
662 this->SetRef(ma, me, mg, n, inX, inWork, inIWork);
663 }
664
676 template <typename _vectorOwnerTypeX>
677 nmrLSqLinSolutionDynamic(size_t ma, size_t me, size_t mg, size_t n,
679 {
680 this->SetRef(ma, me, mg, n, inX);
681 }
682
691 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE,
692 typename _matrixOwnerTypeG, typename _vectorOwnerTypeX,
693 typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
703
704 /************************************************************************/
705 /* The following are Allocate methods for the LS problem */
706 /************************************************************************/
707
719 template <typename _matrixOwnerTypeA>
721 {
722 this->Allocate(A.rows(), 0, 0, A.cols());
723 }
724
742 template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeWork>
748
749 /************************************************************************/
750 /* The following are SetRef methods for the LS problem */
751 /************************************************************************/
752
764 template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork>
771
785 template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeX>
788 {
789 this->SetRef(inA.rows(), 0, 0, inA.cols(), inX, this->WorkspaceMemory);
790 }
791
792 /************************************************************************/
793 /* The following are Allocate methods for the LSI problem */
794 /************************************************************************/
795
808 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG>
814
833 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG,
834 typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
842
843 /************************************************************************/
844 /* The following are SetRef methods for the LSI problem */
845 /************************************************************************/
846
858 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG,
859 typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork,
860 typename _vectorOwnerTypeIWork>
869
883 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeG, typename _vectorOwnerTypeX>
890
891 /************************************************************************/
892 /* The following are Allocate methods for the LSEI problem */
893 /************************************************************************/
894
908 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE, typename _matrixOwnerTypeG>
915
935 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE,
936 typename _matrixOwnerTypeG, typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
945
946 /************************************************************************/
947 /* The following are SetRef methods for the LSEI problem */
948 /************************************************************************/
949
961 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE, typename _matrixOwnerTypeG,
962 typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork,
963 typename _vectorOwnerTypeIWork>
973
987 template <typename _matrixOwnerTypeA, typename _matrixOwnerTypeE,
988 typename _matrixOwnerTypeG, typename _vectorOwnerTypeX>
996
997 /************************************************************************/
998 /* The following is the Base Allocate Method called by others */
999 /************************************************************************/
1000
1010 inline void Allocate(size_t ma, size_t me, size_t mg, size_t n)
1011 {
1012 this->Malloc(ma, me, mg, n, true, true, true);
1013 this->SetRef(ma, me, mg, n, this->WorkspaceMemory, this->InputMemory, this->OutputMemory);
1014 (this->IWork).SetRef((this->IWorkspaceMemory));
1015 }
1016
1026 template <typename _vectorOwnerTypeWork>
1027 inline void Allocate(size_t ma, size_t me, size_t mg, size_t n,
1029 {
1030 CISSTNETLIB_INTEGER lwork = nmrLSqLinSolutionDynamic::GetWorkspaceSize(ma, me, mg, n);
1031 if (lwork > static_cast<CISSTNETLIB_INTEGER>(inWork.size())) {
1032 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for Work"));
1033 }
1034 this->Malloc(ma, me, mg, n, false, true, true);
1035 this->SetRef(ma, me, mg, n, inWork, this->InputMemory, this->OutputMemory);
1036 }
1037
1047 template <typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
1048 inline void Allocate(size_t ma, size_t me, size_t mg, size_t n,
1051 {
1052 CISSTNETLIB_INTEGER lwork = nmrLSqLinSolutionDynamic::GetWorkspaceSize(ma, me, mg, n);
1053 if (lwork > static_cast<CISSTNETLIB_INTEGER>(inWork.size())) {
1054 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for Work"));
1055 }
1056 CISSTNETLIB_INTEGER liwork = nmrLSqLinSolutionDynamic::GetIWorkspaceSize(ma, me, mg, n);
1057 if (liwork > static_cast<CISSTNETLIB_INTEGER>(inIWork.size())) {
1058 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for IWork"));
1059 }
1060 this->Malloc(ma, me, mg, n, false, true, true);
1061 this->SetRef(ma, me, mg, n, inWork, this->InputMemory, this->OutputMemory);
1062 (this->IWork).SetRef(inIWork);
1063 }
1064
1065 /************************************************************************/
1066 /* The following is the Base SetRef Method called by others */
1067 /************************************************************************/
1068
1078 template <typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork>
1079 void SetRef(size_t ma, size_t me, size_t mg, size_t n,
1081 {
1082 CISSTNETLIB_INTEGER lwork = nmrLSqLinSolutionDynamic::GetWorkspaceSize(ma, me, mg, n);
1083 if (lwork > static_cast<CISSTNETLIB_INTEGER>(inWork.size())) {
1084 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for Work"));
1085 }
1086 if (n > static_cast<CISSTNETLIB_INTEGER>(inX.size())) {
1087 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for X"));
1088 }
1089 this->Malloc(ma, me, mg, n, false, true, false);
1090 this->SetRef(ma, me, mg, n, inWork, this->InputMemory, inX);
1091 }
1092
1101 template <typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork, typename _vectorOwnerTypeIWork>
1102 void SetRef(size_t ma, size_t me, size_t mg, size_t n,
1106 {
1107 CISSTNETLIB_INTEGER lwork = nmrLSqLinSolutionDynamic::GetWorkspaceSize(ma, me, mg, n);
1108 if (lwork > static_cast<CISSTNETLIB_INTEGER>(inWork.size())) {
1109 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for Work"));
1110 }
1111 CISSTNETLIB_INTEGER liwork = nmrLSqLinSolutionDynamic::GetIWorkspaceSize(ma, me, mg, n);
1112 if (liwork > static_cast<CISSTNETLIB_INTEGER>(inIWork.size())) {
1113 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for IWork"));
1114 }
1115 if (n > inX.size()) {
1116 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for X"));
1117 }
1118 this->Malloc(ma, me, mg, n, false, true, false);
1119 this->SetRef(ma, me, mg, n, inWork, this->InputMemory, inX);
1120 (this->IWork).SetRef(inIWork);
1121 }
1122
1131 template <typename _vectorOwnerTypeX>
1132 void SetRef(size_t ma, size_t me, size_t mg, size_t n,
1134 {
1135 if (n > inX.size()) {
1136 cmnThrow(std::runtime_error("nmrLSqLin: Incorrect size for X"));
1137 }
1138 this->Malloc(ma, me, mg, n, true, true, false);
1139 this->SetRef(ma, me, mg, n, this->WorkspaceMemory, this->InputMemory, inX);
1140 (this->IWork).SetRef((this->IWorkspaceMemory));
1141 }
1142
1143protected:
1156
1157 void Malloc(size_t ma, size_t me, size_t mg, size_t n, bool allocateWorkspace, bool allocateInput, bool allocateOutput)
1158 {
1159 m_Ma = ma; m_N = n;
1160 m_Me = me; m_Mg = mg;
1161 if (allocateWorkspace) {
1162 (this->WorkspaceMemory).SetSize(nmrLSqLinSolutionDynamic::GetWorkspaceSize(ma, me, mg, n));
1163 (this->IWorkspaceMemory).SetSize(nmrLSqLinSolutionDynamic::GetIWorkspaceSize(ma, me, mg, n));
1164 }
1165 // allocate InputMemory if mg >0 (LSI or LSEI)
1166 if (mg > 0 && allocateInput) {
1167 (this->InputMemory).SetSize(ma + me + mg, n+1, VCT_COL_MAJOR);
1168 }
1169 if (allocateOutput) {
1170 (this->OutputMemory).SetSize(n);
1171 }
1172 (this->RNorm).SetSize(ma+me);
1173 (this->RNormL).SetRef(ma, (this->RNorm).Pointer(), 1);
1174 (this->RNormE).SetRef(me, (this->RNorm).Pointer(ma), 1);
1175 }
1176 template <typename _vectorOwnerTypeWork, typename _matrixOwnerTypeI, typename _vectorOwnerTypeX>
1177 void SetRef(size_t ma, size_t me, size_t mg, size_t n,
1181 {
1182 //workspace
1183 (this->Work).SetRef(work);
1184 // setref InputMemory if mg >0 (LSI or LSEI)
1185 if (mg > 0) {
1186 if (me > 0) {
1187 //size_type startRow, size_type startCol, size_type rows, size_type cols
1188 //size_type startPosition, size_type length
1189 (this->E).SetRef(input, 0, 0, me, n);
1190 (this->f).SetRef(me, input.Column(n).Pointer(0), 1);
1191 (this->A).SetRef(input, me, 0, ma, n);
1192 (this->b).SetRef(ma, input.Column(n).Pointer(me), 1);
1193 (this->G).SetRef(input, ma + me, 0, mg, n);
1194 (this->h).SetRef(mg, input.Column(n).Pointer(ma + me), 1);
1195 } else {
1196 (this->A).SetRef(input, 0, 0, ma, n);
1197 (this->b).SetRef(ma, input.Column(n).Pointer(0), 1);
1198 (this->G).SetRef(input, ma, 0, mg, n);
1199 (this->h).SetRef(mg, input.Column(n).Pointer(ma), 1);
1200 }
1201 }
1202 //output
1203 (this->X).SetRef(n, x.Pointer(0), 1);
1204 }
1205
1206public:
1212 return X;
1213 }
1215 return RNormL;
1216 }
1218 return RNormE;
1219 }
1220};
1221
1242template <typename _matrixOwnerType, typename _vectorOwnerType>
1245 nmrLSqLinSolutionDynamic &solution) CISST_THROW(std::runtime_error)
1246{
1247 typename nmrLSqLinSolutionDynamic::Friend solutionFriend(solution);
1248 CISSTNETLIB_INTEGER ret_value;
1249 /* check that the size and storage order matches with Allocate() */
1250 if (A.IsRowMajor() != VCT_COL_MAJOR) {
1251 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Input must be in Column Major format"));
1252 }
1253 CISSTNETLIB_INTEGER Mrows = static_cast<CISSTNETLIB_INTEGER>(A.rows());
1254 CISSTNETLIB_INTEGER Ncols = static_cast<CISSTNETLIB_INTEGER>(A.cols());
1255 if ((Mrows != solutionFriend.GetMa()) || (Ncols != solutionFriend.GetN())) {
1256 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size used for Allocate was different"));
1257 }
1258 if (Mrows != static_cast<CISSTNETLIB_INTEGER>(b.size())) {
1259 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size of b must be same as number of rows of A"));
1260 }
1261 char trans = 'N';
1262 CISSTNETLIB_INTEGER nrhs = 1;
1263 CISSTNETLIB_INTEGER lda = std::max(Mrows,static_cast<CISSTNETLIB_INTEGER>(1));
1264 CISSTNETLIB_INTEGER ldb = std::max(std::max(static_cast<CISSTNETLIB_INTEGER>(1),Mrows),Ncols);
1265 CISSTNETLIB_INTEGER lwork = nmrLSqLinSolutionDynamic::GetWorkspaceSize(Mrows, 0, 0, Ncols);
1266
1267 CISSTNETLIB_DOUBLE *b_ptr = b.Pointer();
1268 if (Mrows < Ncols) {
1269 // Since dgels returns the result, x, in the input array, b, we need
1270 // to make sure that b is large enough. In the underdetermined case (M < N)
1271 // we would therefore have to resize b from M to N; it is more efficient to instead
1272 // pass x, after assigning all M elements of b to x.
1273 solutionFriend.GetX().Assign(b, Mrows);
1274 b_ptr = solutionFriend.GetX().Pointer();
1275 }
1276#if defined(CISSTNETLIB_VERSION_MAJOR)
1277#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1278 cisstNetlib_dgels_(&trans, &Mrows, &Ncols, &nrhs,
1279 A.Pointer(), &lda,
1280 b_ptr, &ldb,
1281 solutionFriend.GetWork().Pointer(), &lwork, &ret_value);
1282#endif
1283#else // no major version
1284 dgels_(&trans, &Mrows, &Ncols, &nrhs,
1285 A.Pointer(), &lda,
1286 b_ptr, &ldb,
1287 solutionFriend.GetWork().Pointer(), &lwork, &ret_value);
1288#endif // CISSTNETLIB_VERSION
1289
1290 if (Mrows >= Ncols) {
1291 // Dgels returns the result in the "b" vector. For the underdetermined case
1292 // (M < N), we already passed the solution vector, x, as "b". Thus, we only
1293 // need to handle the other case here (M >= N), where we need to copy the
1294 // first Ncols elements of b to the solution vector, x.
1295 solutionFriend.GetX().Assign(b, Ncols);
1296 }
1297 return ret_value;
1298}
1299
1322template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb,
1323 typename _matrixOwnerTypeG, typename _vectorOwnerTypeh>
1328 nmrLSqLinSolutionDynamic &solution) CISST_THROW(std::runtime_error)
1329{
1330 typename nmrLSqLinSolutionDynamic::Friend solutionFriend(solution);
1331 /* check that the size and storage order matches with Allocate() */
1332 if ((A.IsRowMajor() != VCT_COL_MAJOR) || (G.IsRowMajor() != VCT_COL_MAJOR)) {
1333 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Input must be in Column Major format"));
1334 }
1335 CISSTNETLIB_INTEGER ma = static_cast<CISSTNETLIB_INTEGER>(A.rows());
1336 CISSTNETLIB_INTEGER mg = static_cast<CISSTNETLIB_INTEGER>(G.rows());
1337 CISSTNETLIB_INTEGER na = static_cast<CISSTNETLIB_INTEGER>(A.cols());
1338 CISSTNETLIB_INTEGER ng = static_cast<CISSTNETLIB_INTEGER>(G.cols());
1339 if ((ma != solutionFriend.GetMa()) || (mg != solutionFriend.GetMg())
1340 || (na != solutionFriend.GetN()) || (ng != solutionFriend.GetN())) {
1341 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size used for Allocate was different"));
1342 }
1343 if (ma != static_cast<CISSTNETLIB_INTEGER>(b.size())) {
1344 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size of b must be same as number of rows of A"));
1345 }
1346 if (mg != static_cast<CISSTNETLIB_INTEGER>(h.size())) {
1347 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size of h must be same as number of rows of G"));
1348 }
1349 // make a copy of A, b, G, h
1350 solutionFriend.GetA().Assign(A);
1351 solutionFriend.GetG().Assign(G);
1352 solutionFriend.Getb().Assign(b);
1353 solutionFriend.Geth().Assign(h);
1354 CISSTNETLIB_INTEGER mdw = ma + mg;
1355 CISSTNETLIB_INTEGER mode = 0;
1356 CISSTNETLIB_DOUBLE prgopt = 1.;
1357 solutionFriend.GetIWork()(0) = -1;
1358 solutionFriend.GetIWork()(1) = -1;
1359
1360#if defined(CISSTNETLIB_VERSION_MAJOR)
1361#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1362 cisstNetlib_lsi_(solutionFriend.GetInput().Pointer(), &mdw, &ma, &mg, &na,
1363 &prgopt, solutionFriend.GetX().Pointer(), solutionFriend.GetRNorm().Pointer(), &mode,
1364 solutionFriend.GetWork().Pointer(), solutionFriend.GetIWork().Pointer());
1365#endif
1366#else // no major version
1367 lsi_(solutionFriend.GetInput().Pointer(), &mdw, &ma, &mg, &na,
1368 &prgopt, solutionFriend.GetX().Pointer(), solutionFriend.GetRNorm().Pointer(), &mode,
1369 solutionFriend.GetWork().Pointer(), solutionFriend.GetIWork().Pointer());
1370#endif // CISSTNETLIB_VERSION
1371 return mode;
1372}
1373
1398template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb,
1399 typename _matrixOwnerTypeE, typename _vectorOwnerTypef,
1400 typename _matrixOwnerTypeG, typename _vectorOwnerTypeh>
1407 nmrLSqLinSolutionDynamic &solution) CISST_THROW(std::runtime_error)
1408{
1409 typename nmrLSqLinSolutionDynamic::Friend solutionFriend(solution);
1410 /* check that the size and storage order matches with Allocate() */
1411 if ((A.IsRowMajor() != VCT_COL_MAJOR) || (G.IsRowMajor() != VCT_COL_MAJOR) || (E.IsRowMajor() != VCT_COL_MAJOR)) {
1412 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Input must be in Column Major format"));
1413 }
1414 CISSTNETLIB_INTEGER ma = static_cast<CISSTNETLIB_INTEGER>(A.rows());
1415 CISSTNETLIB_INTEGER me = static_cast<CISSTNETLIB_INTEGER>(E.rows());
1416 CISSTNETLIB_INTEGER mg = static_cast<CISSTNETLIB_INTEGER>(G.rows());
1417 CISSTNETLIB_INTEGER na = static_cast<CISSTNETLIB_INTEGER>(A.cols());
1418 CISSTNETLIB_INTEGER ne = static_cast<CISSTNETLIB_INTEGER>(E.cols());
1419 CISSTNETLIB_INTEGER ng = static_cast<CISSTNETLIB_INTEGER>(G.cols());
1420 if ((ma != solutionFriend.GetMa()) || (mg != solutionFriend.GetMg()) || (me != solutionFriend.GetMe())
1421 || (na != solutionFriend.GetN()) || (ng != solutionFriend.GetN() || (ne != solutionFriend.GetN()))
1422 ) {
1423 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size used for Allocate was different"));
1424 }
1425 if (ma != static_cast<CISSTNETLIB_INTEGER>(b.size())) {
1426 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size of b must be same as number of rows of A"));
1427 }
1428 if (mg != static_cast<CISSTNETLIB_INTEGER>(h.size())) {
1429 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size of h must be same as number of rows of G"));
1430 }
1431 if (me != static_cast<CISSTNETLIB_INTEGER>(f.size())) {
1432 cmnThrow(std::runtime_error("nmrLSqLinSolver Solve: Size of f must be same as number of rows of E"));
1433 }
1434 // make a copy of A, b, E, f, G, h
1435 solutionFriend.GetA().Assign(A);
1436 solutionFriend.GetE().Assign(E);
1437 solutionFriend.GetG().Assign(G);
1438 solutionFriend.Getb().Assign(b);
1439 solutionFriend.Getf().Assign(f);
1440 solutionFriend.Geth().Assign(h);
1441 CISSTNETLIB_INTEGER mdw = ma + mg + me;
1442 CISSTNETLIB_INTEGER mode = 0;
1443 CISSTNETLIB_DOUBLE prgopt = 1.;
1444 solutionFriend.GetIWork()(0) = -1;
1445 solutionFriend.GetIWork()(1) = -1;
1446#if defined(CISSTNETLIB_VERSION_MAJOR)
1447#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1448 cisstNetlib_lsei_(solutionFriend.GetInput().Pointer(), &mdw, &me, &ma, &mg, &na,
1449 &prgopt, solutionFriend.GetX().Pointer(), solutionFriend.GetRNorm().Pointer(ma),
1450 solutionFriend.GetRNorm().Pointer(), &mode,
1451 solutionFriend.GetWork().Pointer(), solutionFriend.GetIWork().Pointer());
1452#endif
1453#else // no major version
1454 lsei_(solutionFriend.GetInput().Pointer(), &mdw, &me, &ma, &mg, &na,
1455 &prgopt, solutionFriend.GetX().Pointer(), solutionFriend.GetRNorm().Pointer(ma),
1456 solutionFriend.GetRNorm().Pointer(), &mode,
1457 solutionFriend.GetWork().Pointer(), solutionFriend.GetIWork().Pointer());
1458#endif // CISSTNETLIB_VERSION
1459 return mode;
1460}
1461
1480template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb, typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork>
1485{
1486 nmrLSqLinSolutionDynamic lsqLinSolution(A.rows(), A.cols(), X, Work);
1487 CISSTNETLIB_INTEGER ret_value = nmrLSqLin(A, b, lsqLinSolution);
1488 return ret_value;
1489}
1490
1506template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb, typename _vectorOwnerTypeX>
1510{
1511 nmrLSqLinSolutionDynamic lsqLinSolution(A.rows(), A.cols(), X);
1512 CISSTNETLIB_INTEGER ret_value = nmrLSqLin(A, b, lsqLinSolution);
1513 return ret_value;
1514}
1515
1534template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb,
1535 typename _matrixOwnerTypeG, typename _vectorOwnerTypeh, typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork>
1547
1565template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb,
1566 typename _matrixOwnerTypeG, typename _vectorOwnerTypeh, typename _vectorOwnerTypeX>
1577
1598template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb,
1599 typename _matrixOwnerTypeE, typename _vectorOwnerTypef,
1600 typename _matrixOwnerTypeG, typename _vectorOwnerTypeh,
1601 typename _vectorOwnerTypeX, typename _vectorOwnerTypeWork>
1615
1635template <typename _matrixOwnerTypeA, typename _vectorOwnerTypeb,
1636 typename _matrixOwnerTypeE, typename _vectorOwnerTypef,
1637 typename _matrixOwnerTypeG, typename _vectorOwnerTypeh,
1638 typename _vectorOwnerTypeX>
1651
1652/*
1653****************************************************************************
1654FIXED SIZE
1655****************************************************************************
1656*/
1657
1664template <vct::size_type _ma, vct::size_type _me, vct::size_type _mg, vct::size_type _n>
1666{
1667public:
1668 enum {MIN_MN = (_ma<_n) ? _ma : _n};
1669 enum {K = (_ma + _mg > _n)?(_ma + _mg) : _n};
1671 enum {LWORK_LSI = _n + (_mg + 2)*(_n + 7) + (vct::size_type)K};
1672 enum {LWORK_LSEI = 2*(_me + _n) + (_mg + 2)*(_n + 7) + (vct::size_type)K};
1675 enum {LIWORK = _mg + 2*_n + 2};
1677 //make sizes 1 if 0, it does not affect anything else
1678 typedef vctFixedSizeMatrixRef<CISSTNETLIB_DOUBLE, (_me==0)?1:_me, _n, 1, (_me==0)?1:_me> TypeE;
1679 typedef vctFixedSizeMatrixRef<CISSTNETLIB_DOUBLE, (_mg==0)?1:_mg, _n, 1, (_mg==0)?1:_mg> TypeG;
1681 typedef vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, (_me==0)?1:_me, 1> Typef;
1682 typedef vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, (_mg==0)?1:_mg, 1> Typeh;
1683 typedef vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, (_me==0)?1:_me, 1> TypeRNormE;
1685
1691protected:
1720
1721public:
1734 class Friend {
1735 private:
1737 public:
1738 Friend(nmrLSqLinSolutionFixedSize<_ma, _me, _mg, _n> &insolution):solution(insolution) {
1739 }
1740 inline TypeX &GetX(void) {
1741 return solution.X;
1742 }
1743 inline TypeRNorm &GetRNorm(void) {
1744 return solution.RNorm;
1745 }
1746 inline TypeInput &GetInput(void) {
1747 return solution.InputMemory;
1748 }
1749 inline TypeWork &GetWork(void) {
1750 return solution.WorkspaceMemory;
1751 }
1752 inline TypeIWork &GetIWork(void) {
1753 return solution.IWorkspaceMemory;
1754 }
1755 };
1756 friend class Friend;
1757
1758public:
1759 /*we set the references too */
1763
1768 inline const TypeX &GetX(void) const {
1769 return X;
1770 }
1771 inline const TypeRNormL &GetRNorm(void) const {
1772 return RNormL;
1773 }
1774 inline const TypeRNormE &GetRNormE(void) const {
1775 return RNormE;
1776 }
1777};
1778
1779/******************************************************************************/
1780/* Overloaded functions for Least Squares (LS) */
1781/******************************************************************************/
1782
1783template <vct::size_type _ma, vct::size_type _n, vct::size_type _work>
1788{
1789 CISSTNETLIB_INTEGER ret_value;
1790 char trans = 'N';
1791 CISSTNETLIB_INTEGER Mrows = static_cast<CISSTNETLIB_INTEGER>(_ma);
1792 CISSTNETLIB_INTEGER Ncols = static_cast<CISSTNETLIB_INTEGER>(_n);
1793 CISSTNETLIB_INTEGER nrhs = 1;
1794 CISSTNETLIB_INTEGER lda = std::max(Mrows,static_cast<CISSTNETLIB_INTEGER>(1));
1795 CISSTNETLIB_INTEGER ldb = std::max(std::max(static_cast<CISSTNETLIB_INTEGER>(1),Mrows),Ncols);
1796 CISSTNETLIB_INTEGER lwork = static_cast<CISSTNETLIB_INTEGER>(nmrLSqLinSolutionFixedSize<_ma, 0, 0, _n>::LWORK);
1797 CMN_ASSERT(lwork <= static_cast<CISSTNETLIB_INTEGER>(_work));
1798 CISSTNETLIB_DOUBLE *b_ptr = b.Pointer();
1799 if (Mrows < Ncols) {
1800 // Since dgels returns the result, x, in the input array, b, we need
1801 // to make sure that b is large enough. In the underdetermined case (M < N)
1802 // we would therefore have to resize b from M to N; it is more efficient to instead
1803 // pass x, after assigning all M elements of b to x.
1804 memcpy(x.Pointer(), b.Pointer(), Mrows*sizeof(CISSTNETLIB_DOUBLE));
1805 b_ptr = x.Pointer();
1806 }
1807
1808#if defined(CISSTNETLIB_VERSION_MAJOR)
1809#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1810 cisstNetlib_dgels_(&trans, &Mrows, &Ncols, &nrhs,
1811 A.Pointer(), &lda,
1812 b_ptr, &ldb,
1813 Work.Pointer(), &lwork, &ret_value);
1814#endif
1815#else // no major version
1816 dgels_(&trans, &Mrows, &Ncols, &nrhs,
1817 A.Pointer(), &lda,
1818 b_ptr, &ldb,
1819 Work.Pointer(), &lwork, &ret_value);
1820#endif // CISSTNETLIB_VERSION
1821
1822 if (Mrows >= Ncols) {
1823 // Dgels returns the result in the "b" vector. For the underdetermined case
1824 // (M < N), we already passed the solution vector, x, as "b". Thus, we only
1825 // need to handle the other case here (M >= N), where we need to copy the
1826 // first Ncols elements of b to the solution vector, x.
1827 x.Assign(b.Pointer());
1828 }
1829 return ret_value;
1830}
1831
1832template <vct::size_type _ma, vct::size_type _n>
1841
1842template <vct::size_type _ma, vct::size_type _n>
1846{
1847 typename nmrLSqLinSolutionFixedSize<_ma, 0, 0, _n>::Friend solutionFriend(solution);
1848 CISSTNETLIB_INTEGER ret_value = nmrLSqLin(A, b, solutionFriend.GetX(), solutionFriend.GetWork());
1849 return ret_value;
1850}
1851
1852/******************************************************************************/
1853/* Overloaded functions for Least Squares Inequality (LSI) */
1854/******************************************************************************/
1855
1856template <vct::size_type _ma, vct::size_type _mg, vct::size_type _n, vct::size_type _work, vct::size_type _iwork>
1863{
1864 CISSTNETLIB_INTEGER ma = static_cast<CISSTNETLIB_INTEGER>(_ma);
1865 CISSTNETLIB_INTEGER mg = static_cast<CISSTNETLIB_INTEGER>(_mg);
1866 CISSTNETLIB_INTEGER na = static_cast<CISSTNETLIB_INTEGER>(_n);
1869 vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, _ma, 1> bRef(W.Column(_n).Pointer(0));
1870 vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, _mg, 1> hRef(W.Column(_n).Pointer(_ma));
1871 // make a copy of A, b, G, h
1872 ARef.Assign(A);
1873 GRef.Assign(G);
1874 bRef.Assign(b);
1875 hRef.Assign(h);
1876 CISSTNETLIB_INTEGER mdw = ma + mg;
1877 CISSTNETLIB_INTEGER mode = 0;
1878 CISSTNETLIB_DOUBLE prgopt = 1.;
1879 IWork(0) = -1;
1880 IWork(1) = -1;
1881#if defined(CISSTNETLIB_VERSION_MAJOR)
1882#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1883 cisstNetlib_lsi_(W.Pointer(), &mdw, &ma, &mg, &na,
1884 &prgopt, x.Pointer(), RNorm.Pointer(), &mode,
1885 Work.Pointer(), IWork.Pointer());
1886#endif
1887#else // no major version
1888 lsi_(W.Pointer(), &mdw, &ma, &mg, &na,
1889 &prgopt, x.Pointer(), RNorm.Pointer(), &mode,
1890 Work.Pointer(), IWork.Pointer());
1891#endif // CISSTNETLIB_VERSION
1892 return mode;
1893}
1894
1895template <vct::size_type _ma, vct::size_type _mg, vct::size_type _n>
1914
1915template <vct::size_type _ma, vct::size_type _mg, vct::size_type _n>
1921{
1922 typename nmrLSqLinSolutionFixedSize<_ma, 0, _mg, _n>::Friend solutionFriend(solution);
1923 CISSTNETLIB_INTEGER ret_value;
1924 // for some reason windows gets confused with the templates to match, so explicitly
1925 // specifying the template parameters for the functions helps .net
1928 (A, b, G, h,
1929 solutionFriend.GetX(), solutionFriend.GetInput(),
1930 solutionFriend.GetRNorm(), solutionFriend.GetWork(), solutionFriend.GetIWork());
1931 return ret_value;
1932}
1933
1934/******************************************************************************/
1935/* Overloaded functions for Least Squares Equality & Inequality (LSEI) */
1936/******************************************************************************/
1937
1938template <vct::size_type _ma, vct::size_type _me, vct::size_type _mg,
1947{
1948 CISSTNETLIB_INTEGER me = static_cast<CISSTNETLIB_INTEGER>(_me);
1949 CISSTNETLIB_INTEGER ma = static_cast<CISSTNETLIB_INTEGER>(_ma);
1950 CISSTNETLIB_INTEGER mg = static_cast<CISSTNETLIB_INTEGER>(_mg);
1951 CISSTNETLIB_INTEGER na = static_cast<CISSTNETLIB_INTEGER>(_n);
1955 vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, _me, 1> fRef(W.Column(_n).Pointer(0));
1956 vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, _ma, 1> bRef(W.Column(_n).Pointer(_me));
1957 vctFixedSizeVectorRef<CISSTNETLIB_DOUBLE, _mg, 1> hRef(W.Column(_n).Pointer(_me + _ma));
1958 // make a copy of A, b, G, h
1959 ARef.Assign(A);
1960 ERef.Assign(E);
1961 GRef.Assign(G);
1962 bRef.Assign(b);
1963 fRef.Assign(f);
1964 hRef.Assign(h);
1965 CISSTNETLIB_INTEGER mdw = ma + me + mg;
1966 CISSTNETLIB_INTEGER mode = 0;
1967 CISSTNETLIB_DOUBLE prgopt = 1.;
1968 IWork(0) = -1;
1969 IWork(1) = -1;
1970#if defined(CISSTNETLIB_VERSION_MAJOR)
1971#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1972 cisstNetlib_lsei_(W.Pointer(), &mdw, &me, &ma, &mg, &na,
1973 &prgopt, x.Pointer(), RNorm.Pointer(_ma), RNorm.Pointer(), &mode,
1974 Work.Pointer(), IWork.Pointer());
1975#endif
1976#else // no major version
1977 lsei_(W.Pointer(), &mdw, &me, &ma, &mg, &na,
1978 &prgopt, x.Pointer(), RNorm.Pointer(_ma), RNorm.Pointer(), &mode,
1979 Work.Pointer(), IWork.Pointer());
1980#endif // CISSTNETLIB_VERSION
1981 return mode;
1982}
1983
1984template <vct::size_type _ma, vct::size_type _me, vct::size_type _mg, vct::size_type _n>
2002
2003template <vct::size_type _ma, vct::size_type _me, vct::size_type _mg, vct::size_type _n>
2008{
2009 typename nmrLSqLinSolutionFixedSize<_ma, _me, _mg, _n>::Friend solutionFriend(solution);
2010 CISSTNETLIB_INTEGER ret_value;
2011 // for some reason windows gets confused with the templates to match, so explicitly
2012 // specifying the template parameters for the functions helps .net
2015 (A, b, E, f, G, h,
2016 solutionFriend.GetX(), solutionFriend.GetInput(),
2017 solutionFriend.GetRNorm(), solutionFriend.GetWork(), solutionFriend.GetIWork());
2018 return ret_value;
2019}
2020
2021#endif
Definition nmrLSqLin.h:353
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & Geth(void)
Definition nmrLSqLin.h:374
vctDynamicVector< CISSTNETLIB_DOUBLE > & GetRNorm(void)
Definition nmrLSqLin.h:380
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & GetG(void)
Definition nmrLSqLin.h:365
vctDynamicMatrix< CISSTNETLIB_DOUBLE > & GetInput(void)
Definition nmrLSqLin.h:383
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & GetA(void)
Definition nmrLSqLin.h:359
CISSTNETLIB_INTEGER GetN(void)
Definition nmrLSqLin.h:401
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & Getf(void)
Definition nmrLSqLin.h:371
vctDynamicVectorRef< CISSTNETLIB_INTEGER > & GetIWork(void)
Definition nmrLSqLin.h:389
CISSTNETLIB_INTEGER GetMe(void)
Definition nmrLSqLin.h:395
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & Getb(void)
Definition nmrLSqLin.h:368
CISSTNETLIB_INTEGER GetMa(void)
Definition nmrLSqLin.h:392
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & GetWork(void)
Definition nmrLSqLin.h:386
Friend(nmrLSqLinSolutionDynamic &insolution)
Definition nmrLSqLin.h:357
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & GetE(void)
Definition nmrLSqLin.h:362
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & GetX(void)
Definition nmrLSqLin.h:377
CISSTNETLIB_INTEGER GetMg(void)
Definition nmrLSqLin.h:398
Definition nmrLSqLin.h:114
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:461
void Allocate(size_t ma, size_t me, size_t mg, size_t n)
Definition nmrLSqLin.h:1010
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:510
static void AllocateIWorkspace(CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n, vctDynamicVector< CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:286
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > X
Definition nmrLSqLin.h:149
vctDynamicVectorRef< CISSTNETLIB_INTEGER > IWork
Definition nmrLSqLin.h:153
vctDynamicVector< CISSTNETLIB_DOUBLE > OutputMemory
Definition nmrLSqLin.h:124
void Allocate(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition nmrLSqLin.h:720
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:545
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX)
Definition nmrLSqLin.h:884
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > f
Definition nmrLSqLin.h:147
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > RNormL
Definition nmrLSqLin.h:150
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &E, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:639
void Allocate(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:1027
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &inE, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:694
const vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & GetX(void) const
Definition nmrLSqLin.h:1211
void Allocate(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inIWork)
Definition nmrLSqLin.h:835
static void AllocateIWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &inE, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVector< CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:333
void Allocate(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &E, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_DOUBLE > &inIWork)
Definition nmrLSqLin.h:937
static CISSTNETLIB_INTEGER GetIWorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG)
Definition nmrLSqLin.h:254
static void AllocateWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVector< CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:306
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > b
Definition nmrLSqLin.h:146
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > G
Definition nmrLSqLin.h:145
size_t m_N
Definition nmrLSqLin.h:165
static CISSTNETLIB_INTEGER GetWorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG)
Definition nmrLSqLin.h:248
nmrLSqLinSolutionDynamic(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX)
Definition nmrLSqLin.h:677
static CISSTNETLIB_INTEGER GetIWorkspaceSize(size_t CMN_UNUSED(ma), size_t me, size_t mg, size_t n)
Definition nmrLSqLin.h:190
static void AllocateWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &inE, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVector< CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:325
nmrLSqLinSolutionDynamic(size_t ma, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:562
nmrLSqLinSolutionDynamic(size_t ma, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:476
vctDynamicVector< CISSTNETLIB_DOUBLE > RNorm
Definition nmrLSqLin.h:125
void SetRef(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX)
Definition nmrLSqLin.h:1132
vctDynamicVector< CISSTNETLIB_INTEGER > IWorkspaceMemory
Definition nmrLSqLin.h:120
void Allocate(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:743
void SetRef(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:1079
nmrLSqLinSolutionDynamic(size_t ma, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX)
Definition nmrLSqLin.h:495
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition nmrLSqLin.h:447
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > E
Definition nmrLSqLin.h:144
static void AllocateIWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVector< CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:313
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:765
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G)
Definition nmrLSqLin.h:529
nmrLSqLinSolutionDynamic(size_t ma, size_t n)
Definition nmrLSqLin.h:420
static CISSTNETLIB_INTEGER GetWorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &inE, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG)
Definition nmrLSqLin.h:263
void Allocate(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &E, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G)
Definition nmrLSqLin.h:909
void SetRef(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &work, vctDynamicMatrixBase< _matrixOwnerTypeI, CISSTNETLIB_DOUBLE > &input, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &x)
Definition nmrLSqLin.h:1177
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > RNormE
Definition nmrLSqLin.h:151
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > h
Definition nmrLSqLin.h:148
void Allocate(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G)
Definition nmrLSqLin.h:809
size_t m_Mg
Definition nmrLSqLin.h:164
nmrLSqLinSolutionDynamic(size_t ma, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX)
Definition nmrLSqLin.h:582
void SetRef(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_DOUBLE > &inIWork)
Definition nmrLSqLin.h:1102
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > A
Definition nmrLSqLin.h:143
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inIWork)
Definition nmrLSqLin.h:861
static CISSTNETLIB_INTEGER GetIWorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &inE, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG)
Definition nmrLSqLin.h:270
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX)
Definition nmrLSqLin.h:786
nmrLSqLinSolutionDynamic(size_t ma, size_t me, size_t mg, size_t n)
Definition nmrLSqLin.h:430
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &inE, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_DOUBLE > &inIWork)
Definition nmrLSqLin.h:964
static CISSTNETLIB_INTEGER GetWorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA)
Definition nmrLSqLin.h:240
size_t m_Me
Definition nmrLSqLin.h:163
vctDynamicMatrix< CISSTNETLIB_DOUBLE > InputMemory
Definition nmrLSqLin.h:138
static void AllocateWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicVector< CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:296
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:599
const vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & GetRNorm(void) const
Definition nmrLSqLin.h:1214
static void AllocateWorkspace(CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n, vctDynamicVector< CISSTNETLIB_DOUBLE > &inWork)
Definition nmrLSqLin.h:282
void Malloc(size_t ma, size_t me, size_t mg, size_t n, bool allocateWorkspace, bool allocateInput, bool allocateOutput)
Definition nmrLSqLin.h:1157
static CISSTNETLIB_INTEGER GetWorkspaceSize(size_t ma, size_t me, size_t mg, size_t n)
Definition nmrLSqLin.h:173
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &inE, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &inG, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX)
Definition nmrLSqLin.h:989
nmrLSqLinSolutionDynamic(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeX, CISSTNETLIB_DOUBLE > &inX, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeIWork, CISSTNETLIB_INTEGER > &inIWork)
Definition nmrLSqLin.h:657
nmrLSqLinSolutionDynamic()
Definition nmrLSqLin.h:413
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > Work
Definition nmrLSqLin.h:152
static CISSTNETLIB_INTEGER QueryWorkspaceSize_LS(size_t ma, size_t n)
Definition nmrLSqLin.h:203
void Allocate(size_t ma, size_t me, size_t mg, size_t n, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inWork, vctDynamicVectorBase< _vectorOwnerTypeWork, CISSTNETLIB_DOUBLE > &inIWork)
Definition nmrLSqLin.h:1048
const vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & GetRNormE(void) const
Definition nmrLSqLin.h:1217
size_t m_Ma
Definition nmrLSqLin.h:162
vctDynamicVector< CISSTNETLIB_DOUBLE > WorkspaceMemory
Definition nmrLSqLin.h:119
nmrLSqLinSolutionDynamic(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicMatrixBase< _matrixOwnerTypeE, CISSTNETLIB_DOUBLE > &E, vctDynamicMatrixBase< _matrixOwnerTypeG, CISSTNETLIB_DOUBLE > &G)
Definition nmrLSqLin.h:620
nmrLSqLinSolutionDynamic(size_t ma, size_t mg, size_t n)
Definition nmrLSqLin.h:425
Definition nmrLSqLin.h:1734
Friend(nmrLSqLinSolutionFixedSize< _ma, _me, _mg, _n > &insolution)
Definition nmrLSqLin.h:1738
TypeRNorm & GetRNorm(void)
Definition nmrLSqLin.h:1743
TypeIWork & GetIWork(void)
Definition nmrLSqLin.h:1752
TypeWork & GetWork(void)
Definition nmrLSqLin.h:1749
TypeInput & GetInput(void)
Definition nmrLSqLin.h:1746
TypeX & GetX(void)
Definition nmrLSqLin.h:1740
Definition nmrLSqLin.h:1666
@ LWORK
Definition nmrLSqLin.h:1674
vctFixedSizeMatrixRef< CISSTNETLIB_DOUBLE,(_mg==0)?1:_mg, _n, 1,(_mg==0)?1:_mg > TypeG
Definition nmrLSqLin.h:1679
@ K
Definition nmrLSqLin.h:1669
vctFixedSizeVector< CISSTNETLIB_INTEGER, LIWORK > TypeIWork
Definition nmrLSqLin.h:1687
vctFixedSizeVector< CISSTNETLIB_DOUBLE, LWORK > TypeWork
Definition nmrLSqLin.h:1686
nmrLSqLinSolutionFixedSize()
Definition nmrLSqLin.h:1760
TypeWork WorkspaceMemory
Definition nmrLSqLin.h:1695
vctFixedSizeVector< CISSTNETLIB_DOUBLE, _ma+_me > TypeRNorm
Definition nmrLSqLin.h:1689
@ MIN_MN
Definition nmrLSqLin.h:1668
@ LWORK_LS
Definition nmrLSqLin.h:1670
vctFixedSizeVectorRef< CISSTNETLIB_DOUBLE, _ma, 1 > TypeRNormL
Definition nmrLSqLin.h:1684
TypeIWork IWorkspaceMemory
Definition nmrLSqLin.h:1696
vctFixedSizeMatrixRef< CISSTNETLIB_DOUBLE,(_me==0)?1:_me, _n, 1,(_me==0)?1:_me > TypeE
Definition nmrLSqLin.h:1678
vctFixedSizeMatrixRef< CISSTNETLIB_DOUBLE, _ma, _n, 1, _ma > TypeA
Definition nmrLSqLin.h:1676
TypeRNormE RNormE
Definition nmrLSqLin.h:1719
vctFixedSizeVectorRef< CISSTNETLIB_DOUBLE,(_me==0)?1:_me, 1 > TypeRNormE
Definition nmrLSqLin.h:1683
vctFixedSizeVectorRef< CISSTNETLIB_DOUBLE, _ma, 1 > Typeb
Definition nmrLSqLin.h:1680
vctFixedSizeVector< CISSTNETLIB_DOUBLE, _n > TypeX
Definition nmrLSqLin.h:1688
vctFixedSizeVectorRef< CISSTNETLIB_DOUBLE,(_mg==0)?1:_mg, 1 > Typeh
Definition nmrLSqLin.h:1682
TypeInput InputMemory
Definition nmrLSqLin.h:1713
@ LIWORK
Definition nmrLSqLin.h:1675
const TypeRNormE & GetRNormE(void) const
Definition nmrLSqLin.h:1774
@ LWORK_LSI
Definition nmrLSqLin.h:1671
TypeRNorm RNorm
Definition nmrLSqLin.h:1700
@ LWORK_TMP
Definition nmrLSqLin.h:1673
@ LWORK_LSEI
Definition nmrLSqLin.h:1672
const TypeRNormL & GetRNorm(void) const
Definition nmrLSqLin.h:1771
vctFixedSizeVectorRef< CISSTNETLIB_DOUBLE,(_me==0)?1:_me, 1 > Typef
Definition nmrLSqLin.h:1681
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _ma+_me+_mg, _n+1, VCT_COL_MAJOR > TypeInput
Definition nmrLSqLin.h:1690
TypeX X
Definition nmrLSqLin.h:1717
TypeRNormL RNormL
Definition nmrLSqLin.h:1718
const TypeX & GetX(void) const
Definition nmrLSqLin.h:1768
Definition vctDynamicMatrixBase.h:43
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition vctDynamicMatrixBase.h:143
ThisType & Assign(const vctDynamicConstMatrixBase< __matrixOwnerType, value_type > &other)
Definition vctDynamicMatrixBase.h:509
ColumnRefType Column(size_type index) CISST_THROW(std
Definition vctDynamicMatrixBase.h:233
Definition vctForwardDeclarations.h:157
Dynamic matrix referencing existing memory.
Definition vctDynamicMatrixRef.h:75
Definition vctDynamicVectorBase.h:62
pointer Pointer(index_type index=0)
Definition vctDynamicVectorBase.h:155
value_type & X(void)
Definition vctDynamicVectorBase.h:497
ThisType & Assign(const vctDynamicConstVectorBase< __vectorOwnerType, value_type > &other)
Definition vctDynamicVectorBase.h:242
Definition vctForwardDeclarations.h:131
Dynamic vector referencing existing memory.
Definition vctDynamicVectorRef.h:78
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition vctFixedSizeMatrixBase.h:161
Implementation of a fixed-size matrix using template metaprogramming.
Definition vctFixedSizeMatrix.h:54
Definition vctForwardDeclarations.h:110
ThisType & Assign(const vctFixedSizeConstVectorBase< _size, __stride, __elementType, __dataPtrType > &other)
Definition vctFixedSizeVectorBase.h:274
pointer Pointer(size_type index=0)
Definition vctFixedSizeVectorBase.h:226
value_type & X(void)
Definition vctFixedSizeVectorBase.h:559
Implementation of a fixed-size vector using template metaprogramming.
Definition vctFixedSizeVector.h:54
Definition vctForwardDeclarations.h:89
#define CMN_ASSERT(expr)
Definition cmnAssert.h:97
#define CMN_UNUSED(argument)
Definition cmnPortability.h:497
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
Declaration of the template function cmnThrow.
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
size_t size_type
Definition vctContainerTraits.h:35
Rules of exporting.
CISSTNETLIB_INTEGER nmrLSqLin(vctDynamicMatrixBase< _matrixOwnerType, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerType, CISSTNETLIB_DOUBLE > &b, nmrLSqLinSolutionDynamic &solution) CISST_THROW(std
Definition nmrLSqLin.h:1243
const_pointer Pointer(index_type rowIndex, index_type colIndex) const
Definition vctDynamicConstMatrixBase.h:306
const value_type & W(void) const
Definition vctDynamicConstVectorBase.h:286
const value_type & X(void) const
Definition vctDynamicConstVectorBase.h:263
Declaration of vctDynamicMatrix.
void SetSize(size_type rows, size_type cols, bool storageOrder)
Definition vctDynamicMatrix.h:364
Declaration of vctFixedSizeMatrix.
const bool VCT_COL_MAJOR
Definition vctForwardDeclarations.h:44