12#ifndef KRONECKER_TENSOR_PRODUCT_H
13#define KRONECKER_TENSOR_PRODUCT_H
27template<
typename Derived_A,
typename Derived_B,
typename Derived_AB>
28void kroneckerProduct_full(
const Derived_A& A,
const Derived_B& B, Derived_AB & AB)
30 const unsigned int Ar = A.rows(),
34 for (
unsigned int i=0; i<Ar; ++i)
35 for (
unsigned int j=0; j<Ac; ++j)
36 AB.block(i*Br,j*Bc,Br,Bc) = A(i,j)*B;
47template<
typename Derived_A,
typename Derived_B,
typename Derived_AB>
48void kroneckerProduct_sparse(
const Derived_A &A,
const Derived_B &B, Derived_AB &AB)
50 const unsigned int Ar = A.rows(),
54 AB.resize(Ar*Br,Ac*Bc);
56 AB.reserve(A.nonZeros()*B.nonZeros());
58 for (
int kA=0; kA<A.outerSize(); ++kA)
60 for (
int kB=0; kB<B.outerSize(); ++kB)
62 for (
typename Derived_A::InnerIterator itA(A,kA); itA; ++itA)
64 for (
typename Derived_B::InnerIterator itB(B,kB); itB; ++itB)
66 const unsigned int iA = itA.row(),
72 AB.insert(i,j) = itA.value() * itB.value();
90template<
typename A,
typename B,
typename CScalar,
int CRows,
int CCols,
int COptions,
int CMaxRows,
int CMaxCols>
93 c.resize(a.rows()*b.rows(),a.cols()*b.cols());
94 internal::kroneckerProduct_full(a.derived(), b.derived(), c);
109template<
typename A,
typename B,
typename C>
113 internal::kroneckerProduct_full(a.derived(), b.derived(), c.derived());
123template<
typename A,
typename B,
typename C>
126 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
136template<
typename A,
typename B,
typename C>
139 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
149template<
typename A,
typename B,
typename C>
152 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());