diff +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
line wrap: on
line diff
--- a/+grid/Cartesian.m	Tue Feb 23 13:25:43 2016 +0100
+++ b/+grid/Cartesian.m	Wed Feb 24 15:01:54 2016 +0100
@@ -31,6 +31,10 @@
             o = obj.d;
         end
 
+        function m = size(obj)
+            m = obj.m;
+        end
+
         % points returns a n x d matrix containing the coordianets for all points.
         % points are ordered according to the kronecker product with X*Y*Z
         function X = points(obj)
@@ -71,5 +75,39 @@
                 X{i} = repmat(t,s);
             end
         end
+
+        % Restricts the grid function gf on obj to the subgrid g.
+        % Only works for even multiples
+        function gf = restrictFunc(obj, gf, g)
+            m1 = obj.m;
+            m2 = g.m;
+
+            % Check the input
+            if prod(m1) ~= numel(gf)
+                error('grid:Cartesian:restrictFunc:NonMatchingFunctionSize', 'The grid function has to few or too many points.');
+            end
+
+            if ~all(mod(m1-1,m2-1) == 0)
+                error('grid:Cartesian:restrictFunc:NonMatchingGrids', 'Only integer downsamplings are allowed');
+            end
+
+            % Calculate stride for each dimension
+            stride = (m1-1)./(m2-1);
+
+            % Create downsampling indecies
+            I = {};
+            for i = 1:length(m1)
+                I{i} = 1:stride(i):m1(i);
+            end
+
+            gf = reshapeRowMaj(gf, m1);
+            gf = gf(I{:});
+            gf = reshapeRowMaj(gf, prod(m2));
+        end
+
+        % Projects the grid function gf on obj to the grid g.
+        function gf = projectFunc(obj, gf, g)
+            error('grid:Cartesian:NotImplemented')
+        end
     end
 end
\ No newline at end of file