111 lines
3.1 KiB
C++
111 lines
3.1 KiB
C++
//==================================================================================================
|
|
/*
|
|
ROTGEN - Runtime Overlay for Eigen
|
|
Copyright : CODE RECKONS
|
|
SPDX-License-Identifier: BSL-1.0
|
|
*/
|
|
//==================================================================================================
|
|
|
|
//==================================================================================================
|
|
/*
|
|
This file is a X-File to generate various svd_impl_* definitions variant
|
|
*/
|
|
//==================================================================================================
|
|
|
|
//==================================================================================================
|
|
// Internal payload
|
|
//==================================================================================================
|
|
struct CLASSNAME::payload
|
|
{
|
|
using matrix_type = Eigen::Matrix<TYPE,Eigen::Dynamic,Eigen::Dynamic,STORAGE_ORDER>;
|
|
Eigen::JacobiSVD<matrix_type> data;
|
|
|
|
payload(SOURCENAME const& src, int options) : data(src.storage()->data,options) {}
|
|
};
|
|
|
|
//==================================================================================================
|
|
// Constructors & Special Members
|
|
//==================================================================================================
|
|
CLASSNAME::CLASSNAME(SOURCENAME const& m, int options)
|
|
: storage_(std::make_unique<payload>(m,options))
|
|
{}
|
|
|
|
|
|
CLASSNAME::CLASSNAME(CLASSNAME const& o)
|
|
: storage_(std::make_unique<payload>(*o.storage_))
|
|
{
|
|
}
|
|
|
|
CLASSNAME::CLASSNAME(CLASSNAME&&) noexcept = default;
|
|
|
|
CLASSNAME& CLASSNAME::operator=(CLASSNAME const& o)
|
|
{
|
|
if (this != &o) storage_->data = o.storage_->data;
|
|
return *this;
|
|
}
|
|
|
|
CLASSNAME& CLASSNAME::operator=(CLASSNAME&& o) noexcept
|
|
{
|
|
if (this != &o) storage_->data = std::move(o.storage_->data);
|
|
return *this;
|
|
}
|
|
|
|
CLASSNAME::~CLASSNAME() = default;
|
|
|
|
int CLASSNAME::rank() const { return storage_->data.rank(); }
|
|
|
|
SOURCENAME CLASSNAME::U() const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign(storage_->data.matrixU());
|
|
return result;
|
|
}
|
|
|
|
SOURCENAME CLASSNAME::U(int r) const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign( storage_->data.matrixU().leftCols(r) );
|
|
return result;
|
|
}
|
|
|
|
SOURCENAME CLASSNAME::singular_values() const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign(storage_->data.singularValues());
|
|
return result;
|
|
}
|
|
|
|
SOURCENAME CLASSNAME::singular_values(int r) const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign(storage_->data.singularValues().head(r));
|
|
return result;
|
|
}
|
|
|
|
SOURCENAME CLASSNAME::D() const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign(storage_->data.singularValues().asDiagonal());
|
|
return result;
|
|
}
|
|
|
|
SOURCENAME CLASSNAME::D(int r) const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign(storage_->data.singularValues().head(r).asDiagonal());
|
|
return result;
|
|
}
|
|
|
|
SOURCENAME CLASSNAME::V() const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign(storage_->data.matrixV());
|
|
return result;
|
|
}
|
|
|
|
SOURCENAME CLASSNAME::V(int r) const
|
|
{
|
|
SOURCENAME result;
|
|
result.storage()->assign( storage_->data.matrixV().leftCols(r) );
|
|
return result;
|
|
}
|