Mercurial > repos > public > sbplib
annotate +grid/Cartesian.m @ 168:ba1ae5b2c45e feature/grids
grid.Cartesian: Added methods and test to fulfilll abstract class.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 24 Feb 2016 15:01:54 +0100 |
parents | ce10ebde3123 |
children | f7bb2a94d291 |
rev | line source |
---|---|
159
ce10ebde3123
Added abstract class Structured.
Jonatan Werpers <jonatan@werpers.com>
parents:
155
diff
changeset
|
1 classdef Cartesian < grid.Structured |
154
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 properties |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 n % Number of points in the grid |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 d % Number of dimensions |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 m % Number of points in each direction |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 x % Cell array of vectors with node placement for each dimension. |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 % General d dimensional grid with n points |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 methods |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 % Creates a cartesian grid given vectors conatining the coordinates |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 % in each direction |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 function obj = Cartesian(varargin) |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 obj.d = length(varargin); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 for i = 1:obj.d |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 obj.x{i} = varargin{i}; |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 obj.m(i) = length(varargin{i}); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 obj.n = prod(obj.m); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 if obj.n == 0 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 error('grid:Cartesian:EmptyGrid','Input parameter gives an empty grid.') |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 % n returns the number of points in the grid |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 function o = N(obj) |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 o = obj.n; |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 % d returns the spatial dimension of the grid |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 function o = D(obj) |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 o = obj.d; |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 |
168
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
34 function m = size(obj) |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
35 m = obj.m; |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
36 end |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
37 |
154
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 % points returns a n x d matrix containing the coordianets for all points. |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 % points are ordered according to the kronecker product with X*Y*Z |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 function X = points(obj) |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 X = zeros(obj.n, obj.d); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 for i = 1:obj.d |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 if iscolumn(obj.x{i}) |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 c = obj.x{i}; |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 else |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 c = obj.x{i}'; |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
50 m_before = prod(obj.m(1:i-1)); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 m_after = prod(obj.m(i+1:end)); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 X(:,i) = kr(ones(m_before,1),c,ones(m_after,1)); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
54 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 % matrices returns a cell array with coordinates in matrix form. |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 % For 2d case these will have to be transposed to work with plotting routines. |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 function X = matrices(obj) |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
60 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 if obj.d == 1 % There is no 1d matrix data type in matlab, handle special case |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 X{1} = reshape(obj.x{1}, [obj.m 1]); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 return |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
64 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
65 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 X = cell(1,obj.d); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
67 for i = 1:obj.d |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
68 s = ones(1,obj.d); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
69 s(i) = obj.m(i); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
70 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
71 t = reshape(obj.x{i},s); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
72 |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
73 s = obj.m; |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
74 s(i) = 1; |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
75 X{i} = repmat(t,s); |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
76 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
77 end |
168
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
78 |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
79 % Restricts the grid function gf on obj to the subgrid g. |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
80 % Only works for even multiples |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
81 function gf = restrictFunc(obj, gf, g) |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
82 m1 = obj.m; |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
83 m2 = g.m; |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
84 |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
85 % Check the input |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
86 if prod(m1) ~= numel(gf) |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
87 error('grid:Cartesian:restrictFunc:NonMatchingFunctionSize', 'The grid function has to few or too many points.'); |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
88 end |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
89 |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
90 if ~all(mod(m1-1,m2-1) == 0) |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
91 error('grid:Cartesian:restrictFunc:NonMatchingGrids', 'Only integer downsamplings are allowed'); |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
92 end |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
93 |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
94 % Calculate stride for each dimension |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
95 stride = (m1-1)./(m2-1); |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
96 |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
97 % Create downsampling indecies |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
98 I = {}; |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
99 for i = 1:length(m1) |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
100 I{i} = 1:stride(i):m1(i); |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
101 end |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
102 |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
103 gf = reshapeRowMaj(gf, m1); |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
104 gf = gf(I{:}); |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
105 gf = reshapeRowMaj(gf, prod(m2)); |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
106 end |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
107 |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
108 % Projects the grid function gf on obj to the grid g. |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
109 function gf = projectFunc(obj, gf, g) |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
110 error('grid:Cartesian:NotImplemented') |
ba1ae5b2c45e
grid.Cartesian: Added methods and test to fulfilll abstract class.
Jonatan Werpers <jonatan@werpers.com>
parents:
159
diff
changeset
|
111 end |
154
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
112 end |
c7b2f645101f
Added classes and functions for Cartesian and equidistant grids.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
113 end |