181 bool allocateWorkspace)
185 if (allocateOutput) {
190 this->OutputMemory.SetSize(outputLength);
194 this->OutputMemory.Pointer(0));
204 this->OutputMemory.SetSize(0);
207 if (allocateWorkspace) {
210 this->WorkspaceReference.
SetRef(this->WorkspaceMemory);
213 this->WorkspaceMemory.SetSize(0);
225 template <
typename _matrixOwnerTypeU,
226 typename _vectorOwnerTypeS,
227 typename _matrixOwnerTypeVt>
237 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Size of matrix U is incorrect."));
240 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Storage order of U is incorrect."));
242 if (!inU.IsCompact()) {
243 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Matrix U must be compact."));
245 if (! inVt.IsSquare(
NMember)) {
246 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Size of matrix Vt is incorrect."));
249 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Storage order of Vt is incorrect."));
251 if (!inVt.IsCompact()) {
252 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Matrix Vt must be compact."));
255 if (minmn != inS.size()) {
256 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Size of vector S is incorrect."));
258 if (!inS.IsCompact()) {
259 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Vector S must be compact."));
271 template <
typename _vectorOwnerTypeWorkspace>
280 if (lwork > inWorkspace.size()) {
281 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Workspace is too small."));
284 if (!inWorkspace.IsCompact()) {
285 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Workspace must be compact."));
300 const size_type lwork_1 = 3 * minmn + maxmn;
302 return (lwork_1 > lwork_2) ? lwork_1 : lwork_2;
310 template <
class _matrixOwnerTypeA>
325 template <
class _matrixOwnerTypeA>
342 template <
class _matrixOwnerTypeA,
class _matrixOwnerTypeS,
class _vectorOwnerTypeS>
350 if ((A.rows() != matrixS.rows()) || (A.cols() != matrixS.cols())) {
351 cmnThrow(std::runtime_error(
"nmrSVDDynamicData::UpdateMatrixS: Size of matrix S is incorrect."));
354 matrixS.Diagonal().Assign(vectorS);
373 return Data.SReference;
376 return Data.UReference;
379 return Data.VtReference;
382 return Data.WorkspaceReference;
391 return Data.StorageOrderMember;
444 template <
class _matrixOwnerTypeA>
464 template <
class _matrixOwnerTypeA,
class _vectorOwnerTypeWorkspace>
485 template <
typename _matrixOwnerTypeU,
486 typename _vectorOwnerTypeS,
487 typename _matrixOwnerTypeVt,
488 typename _vectorOwnerTypeWorkspace>
494 this->
SetRef(inU, inS, inVt, inWorkspace);
507 template <
typename _matrixOwnerTypeU,
508 typename _vectorOwnerTypeS,
509 typename _matrixOwnerTypeVt>
528 template <
class _matrixOwnerTypeA>
532 this->
Allocate(A.rows(), A.cols(), A.StorageOrder());
546 template <
class _matrixOwnerTypeA,
class _vectorOwnerTypeWorkspace>
551 this->
SetDimension(A.rows(), A.cols(), A.StorageOrder());
558 this->WorkspaceReference.
SetRef(inWorkspace);
589 template <
typename _matrixOwnerTypeU,
590 typename _vectorOwnerTypeS,
591 typename _matrixOwnerTypeVt,
592 typename _vectorOwnerTypeWorkspace>
599 this->
SetDimension(inU.rows(),inVt.rows(),inU.StorageOrder());
604 this->SReference.
SetRef(inS);
605 this->UReference.
SetRef(inU);
606 this->VtReference.
SetRef(inVt);
607 this->WorkspaceReference.
SetRef(inWorkspace);
619 template <
typename _matrixOwnerTypeU,
620 typename _vectorOwnerTypeS,
621 typename _matrixOwnerTypeVt>
627 this->
SetDimension(inU.rows(), inVt.rows(), inU.StorageOrder());
630 this->SReference.
SetRef(inS);
631 this->UReference.
SetRef(inU);
632 this->VtReference.
SetRef(inVt);
690template <vct::
size_type _rows, vct::
size_type _cols,
bool _storageOrder = VCT_ROW_MAJOR>
760 {
return Data.SMember; }
763 {
return Data.UMember; }
766 {
return Data.VtMember; }
769 {
return Data.WorkspaceMember; }
996template <
class _matrixOwnerType>
1003 CISSTNETLIB_INTEGER Info;
1006 CISSTNETLIB_INTEGER m_Lwork =
1012 cmnThrow(std::runtime_error(
"nmrSVD: Storage order used for Allocate was different"));
1015 if ((dataFriend.
M() != A.rows()) || (dataFriend.
N() != A.cols())) {
1016 cmnThrow(std::runtime_error(
"nmrSVD: Size used for Allocate was different"));
1019 if (! A.IsCompact()) {
1020 cmnThrow(std::runtime_error(
"nmrSVD: Requires a compact matrix"));
1024 CISSTNETLIB_DOUBLE *UPtr, *VtPtr;
1025 CISSTNETLIB_INTEGER m_Lda, m_Ldu, m_Ldvt;
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;
1036 m_Lda = (1 > dfN) ? 1 : dfN;
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(),
1055 dgesvd_(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
1056 A.Pointer(), &m_Lda, dataFriend.
S().
Pointer(),
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(),
1068 jobu_len, jobvt_len);
1090template <
class _matrixOwnerTypeA,
1091 class _matrixOwnerTypeU,
1092 class _vectorOwnerTypeS,
1093 class _matrixOwnerTypeVt,
1094 class _vectorOwnerTypeWorkspace>
1103 CISSTNETLIB_INTEGER ret_value =
nmrSVD(A, svdData);
1127template <
class _matrixOwnerTypeA,
1128 class _matrixOwnerTypeU,
1129 class _vectorOwnerTypeS,
1130 class _matrixOwnerTypeVt>
1138 CISSTNETLIB_INTEGER ret_value =
nmrSVD(A, svdData);
1179#if CMN_ASSERT_IS_DEFINED
1180 const CISSTNETLIB_INTEGER minmn =
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 =
1191 CMN_ASSERT(lwork <=
static_cast<CISSTNETLIB_INTEGER
>(_work));
1194 CISSTNETLIB_INTEGER info;
1195 CISSTNETLIB_DOUBLE *UPtr, *VtPtr;
1206#if defined(CISSTNETLIB_VERSION)
1208#if defined(CISSTNETLIB_VERSION_MAJOR)
1209#if (CISSTNETLIB_VERSION_MAJOR >= 3)
1210 cisstNetlib_dgesvd_(&jobu, &jobvt, &ldu, &ldvt,
1214 workspace.
Pointer(), &lwork, &info);
1217 dgesvd_(&jobu, &jobvt, &ldu, &ldvt,
1221 workspace.
Pointer(), &lwork, &info);
1224 ftnlen jobu_len = (ftnlen)1, jobvt_len = (ftnlen)1;
1225 la_dzlapack_MP_sgesvd_nat(&jobu, &jobvt, &ldu, &ldvt,
1229 workspace.
Pointer(), &lwork, &info,
1230 jobu_len, jobvt_len);
1251template <vct::
size_type _rows, vct::
size_type _cols, vct::
size_type _minmn,
bool _storageOrder>
1259 const CISSTNETLIB_INTEGER ret_value =
nmrSVD(A, U, S, Vt, workspace);
1289template <vct::
size_type _rows, vct::
size_type _cols,
bool _storageOrder>
1295 CISSTNETLIB_INTEGER ret_value =
nmrSVD( A, dataFriend.
U(), dataFriend.
S(),
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
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
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