9 std::shared_ptr<LinearOperator> Bin) :
LinearOperator(Ain->rows()*Bin->rows(), Ain->cols()*Bin->cols()), A(Ain), B(Bin)
17 Eigen::MatrixXd output(nrows, x.cols());
19 for(
int i=0; i<x.cols(); ++i)
21 Eigen::VectorXd xVec = x.col(i);
22 Eigen::Map<Eigen::MatrixXd> xMat(xVec.data(), B->cols(), A->cols());
23 Eigen::Map<Eigen::MatrixXd> bMat(&output(0,i), B->rows(), A->rows());
25 bMat = A->Apply( B->Apply( xMat ).transpose() ).transpose();
35 Eigen::MatrixXd output(ncols, x.cols());
37 for(
int i=0; i<x.cols(); ++i)
39 Eigen::VectorXd xVec = x.col(i);
40 Eigen::Map<const Eigen::MatrixXd> xMat(xVec.data(), B->rows(), A->rows());
41 Eigen::Map<Eigen::MatrixXd> bMat(&output(0,i), B->cols(), A->cols());
43 bMat = A->ApplyTranspose( B->ApplyTranspose( xMat ).transpose() ).transpose();
51 std::shared_ptr<LinearOperator> B)
53 auto part1 = std::make_shared<KroneckerProductOperator>(A, std::make_shared<IdentityOperator>(B->cols()));
54 auto part2 = std::make_shared<KroneckerProductOperator>(std::make_shared<IdentityOperator>(A->rows()), B);
56 return std::make_shared<SumOperator>(part1, part2);
61 Eigen::Ref<const Eigen::MatrixXd>
const& B)
63 Eigen::MatrixXd output(A.rows()*B.rows(), A.cols()*B.cols());
64 for(
int j=0; j<A.cols(); ++j)
66 for(
int i=0; i<A.rows(); ++i)
68 output.block(i*B.rows(), j*B.cols(), B.rows(), B.cols()) = A(i,j)*B;
KroneckerProductOperator(std::shared_ptr< LinearOperator > Ain, std::shared_ptr< LinearOperator > Bin)
virtual Eigen::MatrixXd Apply(Eigen::Ref< const Eigen::MatrixXd > const &x) override
Generic linear operator base class.
virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref< const Eigen::MatrixXd > const &x)=0
Eigen::MatrixXd KroneckerProduct(Eigen::Ref< const Eigen::MatrixXd > const &A, Eigen::Ref< const Eigen::MatrixXd > const &B)
std::shared_ptr< LinearOperator > KroneckerSum(std::shared_ptr< LinearOperator > A, std::shared_ptr< LinearOperator > B)