Document CwiseNullaryOp
Submitted by Bruno Daniel
Assigned to Nobody
Link to original bugzilla bug (#457)
Version: 3.0
Description
I'd like to suggest a new matrix type derived from MatrixBase with roughly the
following constructor and behavior:
/**
-
CalcMatrix is a read-only matrix without storage recalculating the
-
coefficients in each coeff() call by calling the user function func lazily.
-
func may be a function pointer, an object with overloaded operator() or
-
one of C++0x's lambda functions, std::function.
-
coeff(i, j) is calculated as
-
func(rowOffset + i * rowStride, colOffset + j * colStride)
-
This is for matrices where the repeated recalculation of the coefficients
-
is less costly than creating and accessing the storage only a small but
-
part of the coefficients is actually accessed (which part is only known at
-
runtime).
-
The common views of CalcMatrix are easily implemented:
-
(Nontrivial rowStride and colStride settings are propagated to the
-
views. m_... is the member corresponding to the constructor parameter.)
-
- row(i) = CalcMatrix(1, cols(), m_func, i, 0, m_rowStride)
-
- col(j) = CalcMatrix(rows(), 1, m_func, 0, j, 1, m_colStride)
-
- diagonal() = CalcMatrix(rows(), 1, m_func, 0, 0,
-
cols() * m_colStride + m_rowStride)
-
- block(i, j, rows, cols) = CalcMatrix(rows, cols, m_func, i, j,
-
m_rowStride, m_colStride)
-
Applications:
-
- iota(n) = CalcMatrix(n, [](Index i) { return i; })
-
- Permuted-rows view of another matrix A or a selection of a subset of rows
-
of A in any order:
-
permute_rows(A, perm) =
-
CalcMatrix(perm.size(), A.cols(),
-
& { return A(perm(i), j); }
-
- access to non-contiguous matrix layouts of external libraries.
-
- Kronecker delta: probably better accomplished with
-
VectorXd::Ones(rows).asDiagonal()
*/
template <typename Functype>
CalcMatrix(Index rows, Index cols, Functype& func,
Index rowOffset, Index colOffset, Index rowStride = 1, Index colStride = 1);
As an optimization, rowStride and colStride (and rowOffset, colOffset) could
also be offered as compile-time parameters in order to make
func(rowOffset + i * rowStride, colOffset + j * colStride)
less costly.
A similar subclass for ArrayBase would have to be added in order to be able
to call array() without significant overhead.