diff --git a/doc/Makefile b/doc/Makefile index ebc0a33e..e90e4f26 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -48,6 +48,7 @@ PACKAGE_mir_ndslice = \ concatenation\ dynamic\ field\ + filling\ fuse\ iterator\ mutation\ diff --git a/meson.build b/meson.build index 793ec4a2..f20c8733 100644 --- a/meson.build +++ b/meson.build @@ -40,6 +40,7 @@ mir_algorithm_src = [ 'source/mir/ndslice/connect/cpython.d', 'source/mir/ndslice/dynamic.d', 'source/mir/ndslice/field.d', + 'source/mir/ndslice/filling.d', 'source/mir/ndslice/fuse.d', 'source/mir/ndslice/internal.d', 'source/mir/ndslice/iterator.d', diff --git a/source/mir/ndslice/filling.d b/source/mir/ndslice/filling.d new file mode 100644 index 00000000..5216f6ea --- /dev/null +++ b/source/mir/ndslice/filling.d @@ -0,0 +1,42 @@ +/++ +This is a submodule of $(MREF mir,ndslice). + +Initialisation routines. + +License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0). +Copyright: 2019 Symmetry Investments Group and Kaleidic Associates Advisory Limited. +Authors: Ilya Yaroshenko + +Macros: +SUBREF = $(REF_ALTTEXT $(TT $2), $2, mir, ndslice, $1)$(NBSP) +T2=$(TR $(TDNW $(LREF $1)) $(TD $+)) ++/ +module mir.ndslice.filling; + +import mir.ndslice.slice: Slice, SliceKind; + +/++ +Fills a matrix with the terms of a geometric progression in each row. +Params: + matrix = `m × n` matrix to fill + vec = vector of progression coefficients length of `m` ++/ +void fillVandermonde(F, SliceKind matrixKind, SliceKind kind)(Slice!(F*, 2, matrixKind) matrix, Slice!(const(F)*, 1, kind) vec) +in { + assert(matrix.length == vec.length); +} +body { + import mir.conv: to; + + foreach (v; matrix) + { + F a = vec.front; + vec.popFront; + F x = to!F(1); + foreach (ref e; v) + { + e = x; + x *= a; + } + } +} diff --git a/source/mir/ndslice/package.d b/source/mir/ndslice/package.d index a2491fdc..2060d686 100644 --- a/source/mir/ndslice/package.d +++ b/source/mir/ndslice/package.d @@ -172,6 +172,13 @@ $(TR $(TDNW $(SUBMODULE topology) $(BR) ) ) +$(TR $(TDNW $(SUBMODULE filling) $(BR) + $(SMALL Specialized initialisation routines)) + $(TD + $(SUBREF filling, fillVandermonde) + ) +) + $(TR $(TDNW $(SUBMODULE fuse) $(BR) $(SMALL Data fusing (stacking) $(BR) See also $(SUBMODULE concatenation) submodule. @@ -474,6 +481,7 @@ public import mir.ndslice.concatenation; public import mir.ndslice.chunks; public import mir.ndslice.dynamic; public import mir.ndslice.field; +public import mir.ndslice.filling; public import mir.ndslice.fuse; public import mir.ndslice.iterator; public import mir.ndslice.ndfield; diff --git a/source/mir/ndslice/slice.d b/source/mir/ndslice/slice.d index 47f0ea48..8983bcda 100644 --- a/source/mir/ndslice/slice.d +++ b/source/mir/ndslice/slice.d @@ -271,9 +271,11 @@ auto sliced(size_t N, Iterator)(Iterator iterator, size_t[N] lengths...) return ret; } - import mir.ndslice.topology: universal; + import mir.ndslice.filling: fillVandermonde; + import mir.ndslice.allocation: uninitSlice; auto x = [1.0, 2, 3, 4, 5].sliced; - auto v = vandermondeMatrix(x); + auto v = uninitSlice!double(x.length, x.length); + v.fillVandermonde(x); assert(v == [[ 1.0, 1, 1, 1, 1], [ 1.0, 2, 4, 8, 16],