1 /++
2 This is a submodule of $(MREF mir,ndslice).
3 
4 Initialisation routines.
5 
6 License: $(HTTP www.apache.org/licenses/LICENSE-2.0, Apache-2.0)
7 Copyright: 2020 Ilya Yaroshenko, Kaleidic Associates Advisory Limited, Symmetry Investments
8 Authors: Ilya Yaroshenko
9 
10 Macros:
11 SUBREF = $(REF_ALTTEXT $(TT $2), $2, mir, ndslice, $1)$(NBSP)
12 T2=$(TR $(TDNW $(LREF $1)) $(TD $+))
13 +/
14 module mir.ndslice.filling;
15 
16 import mir.ndslice.slice: Slice, SliceKind;
17 
18 /++
19 Fills a matrix with the terms of a geometric progression in each row.
20 Params:
21     matrix = `m × n` matrix to fill
22     vec = vector of progression coefficients length of `m`
23 See_also: $(LINK2 https://en.wikipedia.org/wiki/Vandermonde_matrix, Vandermonde matrix)
24 +/
25 void fillVandermonde(F, SliceKind matrixKind, SliceKind kind)(Slice!(F*, 2, matrixKind) matrix, Slice!(const(F)*, 1, kind) vec)
26 in {
27     assert(matrix.length == vec.length);
28 }
29 do {
30     import mir.conv: to;
31 
32     foreach (v; matrix)
33     {
34         F a = vec.front;
35         vec.popFront;
36         F x = to!F(1);
37         foreach (ref e; v)
38         {
39             e = x;
40             x *= a;
41         }
42     }
43 }
44 
45 ///
46 @safe pure nothrow version(mir_test) unittest
47 {
48     import mir.ndslice.slice: sliced;
49     import mir.ndslice.allocation: uninitSlice;
50     auto x = [1.0, 2, 3, 4, 5].sliced;
51     auto v = uninitSlice!double(x.length, x.length);
52     v.fillVandermonde(x);
53     assert(v ==
54         [[  1.0,   1,   1,   1,   1],
55          [  1.0,   2,   4,   8,  16],
56          [  1.0,   3,   9,  27,  81],
57          [  1.0,   4,  16,  64, 256],
58          [  1.0,   5,  25, 125, 625]]);
59 }