12 #ifndef KRONECKER_TENSOR_PRODUCT_H
13 #define KRONECKER_TENSOR_PRODUCT_H
27 template<
typename Derived_A,
typename Derived_B,
typename Derived_AB>
28 void 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;
47 template<
typename Derived_A,
typename Derived_B,
typename Derived_AB>
48 void 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();
90 template<
typename A,
typename B,
typename CScalar,
int CRows,
int CCols,
int COptions,
int CMaxRows,
int CMaxCols>
91 void kroneckerProduct(
const MatrixBase<A>& a,
const MatrixBase<B>& b, Matrix<CScalar,CRows,CCols,COptions,CMaxRows,CMaxCols>& c)
93 c.resize(a.rows()*b.rows(),a.cols()*b.cols());
94 internal::kroneckerProduct_full(a.derived(), b.derived(), c);
109 template<
typename A,
typename B,
typename C>
110 void kroneckerProduct(
const MatrixBase<A>& a,
const MatrixBase<B>& b, MatrixBase<C>
const & c_)
112 MatrixBase<C>& c =
const_cast<MatrixBase<C>&
>(c_);
113 internal::kroneckerProduct_full(a.derived(), b.derived(), c.derived());
123 template<
typename A,
typename B,
typename C>
124 void kroneckerProduct(
const MatrixBase<A>& a,
const SparseMatrixBase<B>& b, SparseMatrixBase<C>& c)
126 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
136 template<
typename A,
typename B,
typename C>
137 void kroneckerProduct(
const SparseMatrixBase<A>& a,
const MatrixBase<B>& b, SparseMatrixBase<C>& c)
139 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
149 template<
typename A,
typename B,
typename C>
150 void kroneckerProduct(
const SparseMatrixBase<A>& a,
const SparseMatrixBase<B>& b, SparseMatrixBase<C>& c)
152 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
157 #endif // KRONECKER_TENSOR_PRODUCT_H