27 #ifndef KRONECKER_TENSOR_PRODUCT_H
28 #define KRONECKER_TENSOR_PRODUCT_H
42 template<
typename Derived_A,
typename Derived_B,
typename Derived_AB>
43 void kroneckerProduct_full(
const Derived_A& A,
const Derived_B& B, Derived_AB & AB)
45 const unsigned int Ar = A.rows(),
49 for (
unsigned int i=0; i<Ar; ++i)
50 for (
unsigned int j=0; j<Ac; ++j)
51 AB.block(i*Br,j*Bc,Br,Bc) = A(i,j)*B;
62 template<
typename Derived_A,
typename Derived_B,
typename Derived_AB>
63 void kroneckerProduct_sparse(
const Derived_A &A,
const Derived_B &B, Derived_AB &AB)
65 const unsigned int Ar = A.rows(),
69 AB.resize(Ar*Br,Ac*Bc);
71 AB.reserve(A.nonZeros()*B.nonZeros());
73 for (
int kA=0; kA<A.outerSize(); ++kA)
75 for (
int kB=0; kB<B.outerSize(); ++kB)
77 for (
typename Derived_A::InnerIterator itA(A,kA); itA; ++itA)
79 for (
typename Derived_B::InnerIterator itB(B,kB); itB; ++itB)
81 const unsigned int iA = itA.row(),
87 AB.insert(i,j) = itA.value() * itB.value();
105 template<
typename A,
typename B,
typename CScalar,
int CRows,
int CCols,
int COptions,
int CMaxRows,
int CMaxCols>
106 void kroneckerProduct(
const MatrixBase<A>& a,
const MatrixBase<B>& b, Matrix<CScalar,CRows,CCols,COptions,CMaxRows,CMaxCols>& c)
108 c.resize(a.rows()*b.rows(),a.cols()*b.cols());
109 internal::kroneckerProduct_full(a.derived(), b.derived(), c);
124 template<
typename A,
typename B,
typename C>
125 void kroneckerProduct(
const MatrixBase<A>& a,
const MatrixBase<B>& b, MatrixBase<C>
const & c_)
127 MatrixBase<C>& c =
const_cast<MatrixBase<C>&
>(c_);
128 internal::kroneckerProduct_full(a.derived(), b.derived(), c.derived());
138 template<
typename A,
typename B,
typename C>
139 void kroneckerProduct(
const MatrixBase<A>& a,
const SparseMatrixBase<B>& b, SparseMatrixBase<C>& c)
141 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
151 template<
typename A,
typename B,
typename C>
152 void kroneckerProduct(
const SparseMatrixBase<A>& a,
const MatrixBase<B>& b, SparseMatrixBase<C>& c)
154 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
164 template<
typename A,
typename B,
typename C>
165 void kroneckerProduct(
const SparseMatrixBase<A>& a,
const SparseMatrixBase<B>& b, SparseMatrixBase<C>& c)
167 internal::kroneckerProduct_sparse(a.derived(), b.derived(), c.derived());
172 #endif // KRONECKER_TENSOR_PRODUCT_H