cisst-saw
Loading...
Searching...
No Matches
nmrSVD.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, Anton Deguet
6 Created on: 2005-10-18
7
8 (C) Copyright 2005-2022 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 _nmrSVD_h
27#define _nmrSVD_h
28
33
34// Always include last
36
37
105
106public:
113
117
118protected:
121
128
138
147
152 inline void SetDimension(size_type m,
153 size_type n,
154 bool storageOrder)
155 {
156 StorageOrderMember = storageOrder;
157 MMember = m;
158 NMember = n;
159 }
160
180 inline void AllocateOutputWorkspace( bool allocateOutput,
181 bool allocateWorkspace)
182 {
183
184 // allocate output
185 if (allocateOutput) {
186 const size_type minmn =(MMember<NMember)? MMember: NMember;
187 const size_type outputLength = ( MMember * MMember +
188 NMember * NMember +
189 minmn );
190 this->OutputMemory.SetSize(outputLength);
191 this->UReference.SetRef(MMember, MMember,
194 this->OutputMemory.Pointer(0));
195 this->VtReference.SetRef(NMember, NMember,
198 this->OutputMemory.Pointer(MMember * MMember));
199 this->SReference.SetRef((MMember<NMember)? MMember:NMember,
200 this->OutputMemory.Pointer(MMember*MMember + NMember*NMember),
201 1);
202 }
203 else {
204 this->OutputMemory.SetSize(0);
205 }
206 // allocate workspace
207 if (allocateWorkspace) {
208 this->WorkspaceMemory.SetSize( WorkspaceSize( MMember,
209 NMember ) );
210 this->WorkspaceReference.SetRef(this->WorkspaceMemory);
211 }
212 else {
213 this->WorkspaceMemory.SetSize(0);
214 }
215 }
216
217
225 template <typename _matrixOwnerTypeU,
226 typename _vectorOwnerTypeS,
227 typename _matrixOwnerTypeVt>
228 inline
232 CISST_THROW(std::runtime_error)
233 {
234
235 // check sizes and storage order
236 if (! inU.IsSquare(MMember)) {
237 cmnThrow(std::runtime_error("nmrSVDDynamicData: Size of matrix U is incorrect."));
238 }
239 if (inU.StorageOrder() != StorageOrderMember) {
240 cmnThrow(std::runtime_error("nmrSVDDynamicData: Storage order of U is incorrect."));
241 }
242 if (!inU.IsCompact()) {
243 cmnThrow(std::runtime_error("nmrSVDDynamicData: Matrix U must be compact."));
244 }
245 if (! inVt.IsSquare(NMember)) {
246 cmnThrow(std::runtime_error("nmrSVDDynamicData: Size of matrix Vt is incorrect."));
247 }
248 if (inVt.StorageOrder() != StorageOrderMember) {
249 cmnThrow(std::runtime_error("nmrSVDDynamicData: Storage order of Vt is incorrect."));
250 }
251 if (!inVt.IsCompact()) {
252 cmnThrow(std::runtime_error("nmrSVDDynamicData: Matrix Vt must be compact."));
253 }
254 const size_type minmn = (MMember < NMember)? MMember: NMember;
255 if (minmn != inS.size()) {
256 cmnThrow(std::runtime_error("nmrSVDDynamicData: Size of vector S is incorrect."));
257 }
258 if (!inS.IsCompact()) {
259 cmnThrow(std::runtime_error("nmrSVDDynamicData: Vector S must be compact."));
260 }
261 }
262
263
271 template <typename _vectorOwnerTypeWorkspace>
272 inline void
274 CISST_THROW(std::runtime_error)
275 {
276
277 const size_type lwork =
279
280 if (lwork > inWorkspace.size()) {
281 cmnThrow(std::runtime_error("nmrSVDDynamicData: Workspace is too small."));
282 }
283
284 if (!inWorkspace.IsCompact()) {
285 cmnThrow(std::runtime_error("nmrSVDDynamicData: Workspace must be compact."));
286 }
287 }
288
289public:
290
297 {
298 const size_type minmn = (m < n) ? m : n;
299 const size_type maxmn = (m > n) ? m : n;
300 const size_type lwork_1 = 3 * minmn + maxmn;
301 const size_type lwork_2 = 5 * minmn;
302 return (lwork_1 > lwork_2) ? lwork_1 : lwork_2;
303 }
304
310 template <class _matrixOwnerTypeA>
311 static inline
316
317
325 template <class _matrixOwnerTypeA>
326 static inline
328 {
329 nsize_type matrixSize(A.rows(), A.cols());
330 return matrixSize;
331 }
332
333
342 template <class _matrixOwnerTypeA, class _matrixOwnerTypeS, class _vectorOwnerTypeS>
343 static inline
348 CISST_THROW(std::runtime_error)
349 {
350 if ((A.rows() != matrixS.rows()) || (A.cols() != matrixS.cols())) {
351 cmnThrow(std::runtime_error("nmrSVDDynamicData::UpdateMatrixS: Size of matrix S is incorrect."));
352 }
353 matrixS.SetAll(0.0);
354 matrixS.Diagonal().Assign(vectorS);
355 return matrixS;
356 }
357
358#ifndef SWIG
359#ifndef DOXYGEN
366 class Friend {
367 private:
368 nmrSVDDynamicData & Data;
369 public:
370 Friend(nmrSVDDynamicData &inData): Data(inData) {
371 }
373 return Data.SReference;
374 }
376 return Data.UReference;
377 }
379 return Data.VtReference;
380 }
382 return Data.WorkspaceReference;
383 }
384 inline size_type M(void) {
385 return Data.MMember;
386 }
387 inline size_type N(void) {
388 return Data.NMember;
389 }
390 inline bool StorageOrder(void) {
391 return Data.StorageOrderMember;
392 }
393 };
394 friend class Friend;
395#endif // DOXYGEN
396#endif // SWIG
397
408 MMember(static_cast<size_type>(0)),
409 NMember(static_cast<size_type>(0)),
411 {
412 AllocateOutputWorkspace(false, false);
413 }
414
427 nmrSVDDynamicData(size_type m, size_type n, bool storageOrder)
428 {
429 this->Allocate(m, n, storageOrder);
430 }
431
444 template <class _matrixOwnerTypeA>
449
464 template <class _matrixOwnerTypeA, class _vectorOwnerTypeWorkspace>
470
485 template <typename _matrixOwnerTypeU,
486 typename _vectorOwnerTypeS,
487 typename _matrixOwnerTypeVt,
488 typename _vectorOwnerTypeWorkspace>
496
507 template <typename _matrixOwnerTypeU,
508 typename _vectorOwnerTypeS,
509 typename _matrixOwnerTypeVt>
516
517
528 template <class _matrixOwnerTypeA>
529 inline
531 {
532 this->Allocate(A.rows(), A.cols(), A.StorageOrder());
533 }
534
546 template <class _matrixOwnerTypeA, class _vectorOwnerTypeWorkspace>
547 inline
550 {
551 this->SetDimension(A.rows(), A.cols(), A.StorageOrder());
552
553 // allocate output and set references
554 this->AllocateOutputWorkspace(true, false);
555
556 // set reference on user provided workspace
557 this->ThrowUnlessWorkspaceSizeIsCorrect(inWorkspace);
558 this->WorkspaceReference.SetRef(inWorkspace);
559 }
560
571 void Allocate(size_type m, size_type n, bool storageOrder)
572 {
573 this->SetDimension(m, n, storageOrder);
574 this->AllocateOutputWorkspace(true, true);
575 }
576
589 template <typename _matrixOwnerTypeU,
590 typename _vectorOwnerTypeS,
591 typename _matrixOwnerTypeVt,
592 typename _vectorOwnerTypeWorkspace>
597 CISST_THROW(std::runtime_error)
598 {
599 this->SetDimension(inU.rows(),inVt.rows(),inU.StorageOrder());
600 this->AllocateOutputWorkspace(false, false);
601 this->ThrowUnlessOutputSizeIsCorrect(inU, inS, inVt);
602 this->ThrowUnlessWorkspaceSizeIsCorrect(inWorkspace);
603
604 this->SReference.SetRef(inS);
605 this->UReference.SetRef(inU);
606 this->VtReference.SetRef(inVt);
607 this->WorkspaceReference.SetRef(inWorkspace);
608 }
609
610
619 template <typename _matrixOwnerTypeU,
620 typename _vectorOwnerTypeS,
621 typename _matrixOwnerTypeVt>
625 CISST_THROW(std::runtime_error)
626 {
627 this->SetDimension(inU.rows(), inVt.rows(), inU.StorageOrder());
628 this->ThrowUnlessOutputSizeIsCorrect(inU, inS, inVt);
629
630 this->SReference.SetRef(inS);
631 this->UReference.SetRef(inU);
632 this->VtReference.SetRef(inVt);
633
634 AllocateOutputWorkspace(false, true);
635 }
636
640 inline
642 { return SReference; }
643
647 inline
649 { return UReference; }
650
653 inline
655 { return VtReference; }
656
657};
658
659
660
661
662
689#ifndef SWIG
690template <vct::size_type _rows, vct::size_type _cols, bool _storageOrder = VCT_ROW_MAJOR>
692{
693public:
694#ifndef DOXYGEN
696
697 enum {M = (_storageOrder == VCT_COL_MAJOR) ? _rows : _cols};
698 enum {N = (_storageOrder == VCT_COL_MAJOR) ? _cols : _rows};
699 enum {MIN_MN =
700 (static_cast<size_type>(M) < static_cast<size_type>(N))
701 ?
702 static_cast<size_type>(M)
703 :
704 static_cast<size_type>(N)};
705 enum {LWORK_1 =
706 (3 * static_cast<size_type>(MIN_MN) + (static_cast<size_type>(M)) > static_cast<size_type>(N))
707 ?
708 static_cast<size_type>(M)
709 :
710 static_cast<size_type>(N)};
711 enum {LWORK_2 = 5 * MIN_MN};
712 enum {LWORK =
713 (static_cast<size_type>(LWORK_1) > static_cast<size_type>(LWORK_2))
714 ?
715 static_cast<size_type>(LWORK_1)
716 :
717 static_cast<size_type>(LWORK_2)};
718#endif // DOXYGEN
737
738protected:
743
744public:
745#ifndef DOXYGEN
752 class Friend {
753 private:
755 public:
758
759 inline VectorTypeS & S(void)
760 { return Data.SMember; }
761
762 inline MatrixTypeU & U(void)
763 { return Data.UMember; }
764
765 inline MatrixTypeVt & Vt(void)
766 { return Data.VtMember; }
767
769 { return Data.WorkspaceMember; }
770 };
771 friend class Friend;
772#endif // DOXYGEN
773
777
781 inline const VectorTypeS & S(void) const
782 { return SMember; }
783
787 inline const MatrixTypeU & U(void) const
788 { return UMember; }
789
793 inline const MatrixTypeVt & Vt(void) const
794 { return VtMember; }
795
799 static inline
801 MatrixTypeS & matrixS )
802 {
803 matrixS.SetAll(0.0);
804 matrixS.Diagonal().Assign(vectorS);
805 return matrixS;
806 }
807};
808#endif // SWIG
809
810
811
812
974
975
996template <class _matrixOwnerType>
997inline
999 nmrSVDDynamicData & data)
1000 CISST_THROW(std::runtime_error)
1001{
1002 typename nmrSVDDynamicData::Friend dataFriend(data);
1003 CISSTNETLIB_INTEGER Info;
1004 char m_Jobu = 'A';
1005 char m_Jobvt = 'A';
1006 CISSTNETLIB_INTEGER m_Lwork =
1007 static_cast<CISSTNETLIB_INTEGER>(nmrSVDDynamicData::WorkspaceSize(dataFriend.M(),
1008 dataFriend.N()));
1009
1010 /* check that storage order matches with Allocate() */
1011 if (A.StorageOrder() != dataFriend.StorageOrder()) {
1012 cmnThrow(std::runtime_error("nmrSVD: Storage order used for Allocate was different"));
1013 }
1014 /* check sizes */
1015 if ((dataFriend.M() != A.rows()) || (dataFriend.N() != A.cols())) {
1016 cmnThrow(std::runtime_error("nmrSVD: Size used for Allocate was different"));
1017 }
1018 /* check that the matrices are compact */
1019 if (! A.IsCompact()) {
1020 cmnThrow(std::runtime_error("nmrSVD: Requires a compact matrix"));
1021 }
1022
1023 /* Based on storage order, permute U and Vt as well as dimension */
1024 CISSTNETLIB_DOUBLE *UPtr, *VtPtr;
1025 CISSTNETLIB_INTEGER m_Lda, m_Ldu, m_Ldvt;
1026
1027 CISSTNETLIB_INTEGER dfM = static_cast<CISSTNETLIB_INTEGER>(dataFriend.M());
1028 CISSTNETLIB_INTEGER dfN = static_cast<CISSTNETLIB_INTEGER>(dataFriend.N());
1029 if (A.IsColMajor()) {
1030 m_Lda = (1 > dfM) ? 1 : dfM;
1031 m_Ldu = dfM;
1032 m_Ldvt = dfN;
1033 UPtr = dataFriend.U().Pointer();
1034 VtPtr = dataFriend.Vt().Pointer();
1035 } else {
1036 m_Lda = (1 > dfN) ? 1 : dfN;
1037 m_Ldu = dfN;
1038 m_Ldvt = dfM;
1039 UPtr = dataFriend.Vt().Pointer();
1040 VtPtr = dataFriend.U().Pointer();
1041 }
1042
1043 // for versions based on gfortran/lapack, CISSTNETLIB_VERSION is
1044 // defined
1045#if defined(CISSTNETLIB_VERSION)
1046#if defined(CISSTNETLIB_VERSION_MAJOR)
1047#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1048 cisstNetlib_dgesvd_(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
1049 A.Pointer(), &m_Lda, dataFriend.S().Pointer(),
1050 UPtr, &m_Ldu,
1051 VtPtr, &m_Ldvt,
1052 dataFriend.Workspace().Pointer(), &m_Lwork, &Info);
1053#endif
1054#else // no major version
1055 dgesvd_(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
1056 A.Pointer(), &m_Lda, dataFriend.S().Pointer(),
1057 UPtr, &m_Ldu,
1058 VtPtr, &m_Ldvt,
1059 dataFriend.Workspace().Pointer(), &m_Lwork, &Info);
1060#endif // CISSTNETLIB_VERSION
1061#else
1062 ftnlen jobu_len = (ftnlen)1, jobvt_len = (ftnlen)1;
1063 la_dzlapack_MP_sgesvd_nat(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
1064 A.Pointer(), &m_Lda, dataFriend.S().Pointer(),
1065 UPtr, &m_Ldu,
1066 VtPtr, &m_Ldvt,
1067 dataFriend.Workspace().Pointer(), &m_Lwork, &Info,
1068 jobu_len, jobvt_len);
1069#endif
1070
1071 return Info;
1072}
1073
1090template <class _matrixOwnerTypeA,
1091 class _matrixOwnerTypeU,
1092 class _vectorOwnerTypeS,
1093 class _matrixOwnerTypeVt,
1094 class _vectorOwnerTypeWorkspace>
1095inline
1106
1127template <class _matrixOwnerTypeA,
1128 class _matrixOwnerTypeU,
1129 class _vectorOwnerTypeS,
1130 class _matrixOwnerTypeVt>
1131inline
1141
1142
1143#ifndef SWIG // don't have fixed size containers in Python
1144
1170template <vct::size_type _rows, vct::size_type _cols, vct::size_type _minmn,
1171 vct::size_type _work, bool _storageOrder>
1172inline
1178{
1179#if CMN_ASSERT_IS_DEFINED
1180 const CISSTNETLIB_INTEGER minmn =
1181 static_cast<CISSTNETLIB_INTEGER>(nmrSVDFixedSizeData<_rows, _cols, _storageOrder>::MIN_MN);
1182#endif
1183 //Assert if requirement is greater than size provided!
1184 CMN_ASSERT(minmn <= static_cast<CISSTNETLIB_INTEGER>(_minmn));
1185 CISSTNETLIB_INTEGER ldu = (_storageOrder == VCT_COL_MAJOR) ? _rows : _cols;
1186 CISSTNETLIB_INTEGER lda = (1 > ldu) ? 1 : ldu;
1187 CISSTNETLIB_INTEGER ldvt = (_storageOrder == VCT_COL_MAJOR) ? _cols : _rows;
1188 CISSTNETLIB_INTEGER lwork =
1189 static_cast<CISSTNETLIB_INTEGER>(nmrSVDFixedSizeData<_rows, _cols, _storageOrder>::LWORK);
1190 //Assert if requirement is greater than size provided!
1191 CMN_ASSERT(lwork <= static_cast<CISSTNETLIB_INTEGER>(_work));
1192 char jobu = 'A';
1193 char jobvt = 'A';
1194 CISSTNETLIB_INTEGER info;
1195 CISSTNETLIB_DOUBLE *UPtr, *VtPtr;
1196 if (_storageOrder == VCT_COL_MAJOR) {
1197 UPtr = U.Pointer();
1198 VtPtr = Vt.Pointer();
1199 } else {
1200 UPtr = Vt.Pointer();
1201 VtPtr = U.Pointer();
1202 }
1203
1204 // for versions based on gfortran/lapack, CISSTNETLIB_VERSION is
1205 // defined
1206#if defined(CISSTNETLIB_VERSION)
1207 /* call the LAPACK C function */
1208#if defined(CISSTNETLIB_VERSION_MAJOR)
1209#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1210 cisstNetlib_dgesvd_(&jobu, &jobvt, &ldu, &ldvt,
1211 A.Pointer(), &lda, S.Pointer(),
1212 UPtr, &ldu,
1213 VtPtr, &ldvt,
1214 workspace.Pointer(), &lwork, &info);
1215#endif
1216#else // no major version
1217 dgesvd_(&jobu, &jobvt, &ldu, &ldvt,
1218 A.Pointer(), &lda, S.Pointer(),
1219 UPtr, &ldu,
1220 VtPtr, &ldvt,
1221 workspace.Pointer(), &lwork, &info);
1222#endif // CISSTNETLIB_VERSION
1223#else
1224 ftnlen jobu_len = (ftnlen)1, jobvt_len = (ftnlen)1;
1225 la_dzlapack_MP_sgesvd_nat(&jobu, &jobvt, &ldu, &ldvt,
1226 A.Pointer(), &lda, S.Pointer(),
1227 UPtr, &ldu,
1228 VtPtr, &ldvt,
1229 workspace.Pointer(), &lwork, &info,
1230 jobu_len, jobvt_len);
1231#endif
1232
1233 return info;
1234}
1235
1251template <vct::size_type _rows, vct::size_type _cols, vct::size_type _minmn, bool _storageOrder>
1252inline
1262
1263
1289template <vct::size_type _rows, vct::size_type _cols, bool _storageOrder>
1290inline
1293{
1295 CISSTNETLIB_INTEGER ret_value = nmrSVD( A, dataFriend.U(), dataFriend.S(),
1296 dataFriend.Vt(), dataFriend.Workspace() );
1297 return ret_value;
1298}
1299#endif // SWIG
1300
1302
1303#endif
Definition nmrSVD.h:366
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & S(void)
Definition nmrSVD.h:372
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & Workspace(void)
Definition nmrSVD.h:381
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & U(void)
Definition nmrSVD.h:375
bool StorageOrder(void)
Definition nmrSVD.h:390
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & Vt(void)
Definition nmrSVD.h:378
size_type N(void)
Definition nmrSVD.h:387
size_type M(void)
Definition nmrSVD.h:384
Friend(nmrSVDDynamicData &inData)
Definition nmrSVD.h:370
Data for SVD problem (Dynamic).
Definition nmrSVD.h:104
void ThrowUnlessWorkspaceSizeIsCorrect(vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace) const CISST_THROW(std
Definition nmrSVD.h:273
void AllocateOutputWorkspace(bool allocateOutput, bool allocateWorkspace)
Definition nmrSVD.h:180
static nsize_type MatrixSSize(const vctDynamicConstMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition nmrSVD.h:327
static size_type WorkspaceSize(size_type m, size_type n)
Definition nmrSVD.h:296
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > UReference
Definition nmrSVD.h:133
nmrSVDDynamicData(const vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition nmrSVD.h:445
nmrSVDDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt)
Definition nmrSVD.h:510
vctFixedSizeVector< size_type, 2 > nsize_type
Definition nmrSVD.h:116
size_type NMember
Definition nmrSVD.h:144
nmrSVDDynamicData()
Definition nmrSVD.h:407
const vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & S(void) const
Definition nmrSVD.h:641
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > VtReference
Definition nmrSVD.h:134
void SetRefOutput(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt) CISST_THROW(std
Definition nmrSVD.h:622
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > WorkspaceReference
Definition nmrSVD.h:136
vctDynamicVector< CISSTNETLIB_DOUBLE > OutputMemory
Definition nmrSVD.h:127
void SetRefWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition nmrSVD.h:548
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > SReference
Definition nmrSVD.h:135
void SetDimension(size_type m, size_type n, bool storageOrder)
Definition nmrSVD.h:152
nmrSVDDynamicData(size_type m, size_type n, bool storageOrder)
Definition nmrSVD.h:427
size_type MMember
Definition nmrSVD.h:143
nmrSVDDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition nmrSVD.h:489
const vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & Vt(void) const
Definition nmrSVD.h:654
static size_type WorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA)
Definition nmrSVD.h:312
nmrSVDDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition nmrSVD.h:465
static vctDynamicMatrixBase< _matrixOwnerTypeS, CISSTNETLIB_DOUBLE > & UpdateMatrixS(const vctDynamicConstMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, const vctDynamicConstVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &vectorS, vctDynamicMatrixBase< _matrixOwnerTypeS, CISSTNETLIB_DOUBLE > &matrixS) CISST_THROW(std
Definition nmrSVD.h:345
void Allocate(size_type m, size_type n, bool storageOrder)
Definition nmrSVD.h:571
void ThrowUnlessOutputSizeIsCorrect(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt) const CISST_THROW(std
Definition nmrSVD.h:229
vctDynamicVector< CISSTNETLIB_DOUBLE > WorkspaceMemory
Definition nmrSVD.h:120
bool StorageOrderMember
Definition nmrSVD.h:145
vct::size_type size_type
Definition nmrSVD.h:112
void Allocate(const vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition nmrSVD.h:530
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace) CISST_THROW(std
Definition nmrSVD.h:593
const vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & U(void) const
Definition nmrSVD.h:648
Definition nmrSVD.h:752
MatrixTypeU & U(void)
Definition nmrSVD.h:762
MatrixTypeVt & Vt(void)
Definition nmrSVD.h:765
Friend(nmrSVDFixedSizeData< _rows, _cols, _storageOrder > &inData)
Definition nmrSVD.h:756
VectorTypeWorkspace & Workspace(void)
Definition nmrSVD.h:768
VectorTypeS & S(void)
Definition nmrSVD.h:759
Data of SVD problem (Fixed size).
Definition nmrSVD.h:692
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _rows, _rows, _storageOrder > MatrixTypeU
Definition nmrSVD.h:724
MatrixTypeVt VtMember
Definition nmrSVD.h:740
vct::size_type size_type
Definition nmrSVD.h:695
VectorTypeWorkspace WorkspaceMember
Definition nmrSVD.h:742
const MatrixTypeVt & Vt(void) const
Definition nmrSVD.h:793
const MatrixTypeU & U(void) const
Definition nmrSVD.h:787
VectorTypeS SMember
Definition nmrSVD.h:741
@ LWORK
Definition nmrSVD.h:712
@ MIN_MN
Definition nmrSVD.h:699
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _rows, _cols, _storageOrder > MatrixTypeS
Definition nmrSVD.h:730
const VectorTypeS & S(void) const
Definition nmrSVD.h:781
@ LWORK_2
Definition nmrSVD.h:711
static MatrixTypeS & UpdateMatrixS(const VectorTypeS &vectorS, MatrixTypeS &matrixS)
Definition nmrSVD.h:800
vctFixedSizeVector< CISSTNETLIB_DOUBLE, LWORK > VectorTypeWorkspace
Definition nmrSVD.h:736
@ N
Definition nmrSVD.h:698
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _rows, _cols, _storageOrder > MatrixTypeA
Definition nmrSVD.h:721
@ LWORK_1
Definition nmrSVD.h:705
nmrSVDFixedSizeData()
Definition nmrSVD.h:776
@ M
Definition nmrSVD.h:697
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _cols, _cols, _storageOrder > MatrixTypeVt
Definition nmrSVD.h:733
MatrixTypeU UMember
Definition nmrSVD.h:739
vctFixedSizeVector< CISSTNETLIB_DOUBLE, MIN_MN > VectorTypeS
Definition nmrSVD.h:727
Definition vctForwardDeclarations.h:145
Definition vctForwardDeclarations.h:119
Definition vctDynamicMatrixBase.h:43
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition vctDynamicMatrixBase.h:143
Dynamic matrix referencing existing memory.
Definition vctDynamicMatrixRef.h:75
void SetRef(size_type rows, size_type cols, stride_type rowStride, stride_type colStride, pointer dataPointer)
Definition vctDynamicMatrixRef.h:217
Definition vctDynamicVectorBase.h:62
pointer Pointer(index_type index=0)
Definition vctDynamicVectorBase.h:155
Definition vctForwardDeclarations.h:131
Dynamic vector referencing existing memory.
Definition vctDynamicVectorRef.h:78
void SetRef(size_type size, pointer data, stride_type stride=1)
Definition vctDynamicVectorRef.h:156
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition vctFixedSizeMatrixBase.h:161
DiagonalRefType Diagonal(void)
Definition vctFixedSizeMatrixBase.h:254
value_type SetAll(const value_type value)
Definition vctFixedSizeMatrixBase.h:421
Implementation of a fixed-size matrix using template metaprogramming.
Definition vctFixedSizeMatrix.h:54
pointer Pointer(size_type index=0)
Definition vctFixedSizeVectorBase.h:226
Implementation of a fixed-size vector using template metaprogramming.
Definition vctFixedSizeVector.h:54
#define CMN_ASSERT(expr)
Definition cmnAssert.h:97
#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 nmrSVD(vctDynamicMatrixBase< _matrixOwnerType, CISSTNETLIB_DOUBLE > &A, nmrSVDDynamicData &data) CISST_THROW(std
Definition nmrSVD.h:998
Declaration of vctDynamicMatrix.
Declaration of vctFixedSizeMatrix.
const bool VCT_COL_MAJOR
Definition vctForwardDeclarations.h:44