changeset 579:a5f1b0267dba feature/grids

Be less strict about what is considered a block matrix Empty blocks of different sizes are now allowed as well as empty block dimensions
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 07 Sep 2017 09:21:04 +0200
parents 1fe16b34f114
children 00261f8d7e15
files +blockmatrix/fromMatrixTest.m +blockmatrix/getDivision.m +blockmatrix/getDivisionTest.m +blockmatrix/isBlockmatrix.m +blockmatrix/isDivision.m +blockmatrix/isDivisionTest.m +blockmatrix/toMatrixTest.m +blockmatrix/zero.m +blockmatrix/zeroTest.m
diffstat 9 files changed, 77 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/+blockmatrix/fromMatrixTest.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/fromMatrixTest.m	Thu Sep 07 09:21:04 2017 +0200
@@ -46,6 +46,20 @@
                 [23 5; 4 6; 10 12; 11 18], [7 14 16; 13 20 22; 19 21 3; 25 2 9];
             };
         },
+        {
+            {
+                magic(3),
+                {[1 0 2],[1 2 0]}
+            },
+            mat2cell(magic(3),[1 0 2],[1 2 0])
+        },
+        {
+            {
+                zeros(0,1),
+                {0,1},
+            },
+            {zeros(0,1)}
+        },
     };
     for i = 1:length(cases)
         out = convertToFull(blockmatrix.fromMatrix(cases{i}{1}{:}));
--- a/+blockmatrix/getDivision.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/getDivision.m	Thu Sep 07 09:21:04 2017 +0200
@@ -16,7 +16,7 @@
     m = zeros(1,size(C,2));
     for j = 1:size(C,2)
         for i = 1:size(C,1)
-            if isempty(C{i,j})
+            if isNullMatrix(C{i,j})
                 continue
             end
             m(j) = size(C{i,j},2);
@@ -28,10 +28,15 @@
     n = zeros(1,size(C,1));
     for i = 1:size(C,1)
         for j = 1:size(C,2)
-            if isempty(C{i,j})
+            if isNullMatrix(C{i,j})
                 continue
             end
             n(i) = size(C{i,j},1);
         end
     end
-end
\ No newline at end of file
+end
+
+function b = isNullMatrix(A)
+    [n, m] = size(A);
+    b = n == 0 && m == 0;
+end
--- a/+blockmatrix/getDivisionTest.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/getDivisionTest.m	Thu Sep 07 09:21:04 2017 +0200
@@ -56,6 +56,18 @@
             },
             {[2 1], 2}
         },
+        {
+            {zeros(3,0)},
+            {3, 0},
+        },
+        {
+            {zeros(3,0), zeros(3,0)},
+            {3, [0, 0]},
+        },
+        {
+            {zeros(3,0); zeros(2,0)},
+            {[3 2],0},
+        },
     };
 
     for i = 1:length(cases)
--- a/+blockmatrix/isBlockmatrix.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/isBlockmatrix.m	Thu Sep 07 09:21:04 2017 +0200
@@ -4,7 +4,7 @@
         return
     end
 
-    % Make sure all blocks are numerica matrices
+    % Make sure all blocks are numerical matrices
     for i = 1:length(bm)
         if ~isnumeric(bm{i})
             b = false;
--- a/+blockmatrix/isDivision.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/isDivision.m	Thu Sep 07 09:21:04 2017 +0200
@@ -21,11 +21,11 @@
 
 function b = isDivisionVector(v)
     if isempty(v)
-        b = false;
+        b = true;
         return
     end
 
-    if any(v <= 0)
+    if any(v < 0)
         b = false;
         return
     end
--- a/+blockmatrix/isDivisionTest.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/isDivisionTest.m	Thu Sep 07 09:21:04 2017 +0200
@@ -4,14 +4,16 @@
 
 function testIsDivision(testCase)
     cases = {
+        {[1 2] ,false},     % Must be a cell array
+        {{[1 2 3]} ,false}, % Must have two vectors
+        {{[],[]}, true}     % No blocks is a valid blockmatrix
+        {{[1 2],[]} ,true},
+        {{[],[1 2]} ,true},
         {{[2 2 2],[1 2]} ,true},
-        {{[1 2],[1 0]} ,false},
-        {{[0 2],[1 1]} ,false},
-        {{[1 2],[]} ,false},
+        {{[1 2],[1 0]} ,true},
+        {{[0 2],[1 1]} ,true},
         {{[1 2],[1]} ,true},
         {{[1 2],[1], [1 2 3]} ,false},
-        {{[1 2 3]} ,false},
-        {[1 2] ,false},
     };
 
     for i = 1:length(cases)
--- a/+blockmatrix/toMatrixTest.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/toMatrixTest.m	Thu Sep 07 09:21:04 2017 +0200
@@ -51,6 +51,22 @@
             [2 2 1;
              2 1 2],
         },
+        {
+            {zeros(0,0)},
+            [],
+        },
+        {
+            {zeros(3,0), zeros(3,0)},
+            zeros(3,0),
+        },
+        {
+            {zeros(3,0); zeros(2,0)},
+            zeros(5,0),
+        },
+        {
+            {zeros(0,3), zeros(0,2)},
+            zeros(0,5),
+        },
     };
 
     for i = 1:length(cases)
--- a/+blockmatrix/zero.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/zero.m	Thu Sep 07 09:21:04 2017 +0200
@@ -1,6 +1,6 @@
 % Creates a block matrix according to the division with zeros everywhere.
 function bm = zero(div)
-    if ~blockmatrix.isDivision(div);
+    if ~blockmatrix.isDivision(div)
         error('div is not a valid division');
     end
 
--- a/+blockmatrix/zeroTest.m	Thu Sep 07 09:18:55 2017 +0200
+++ b/+blockmatrix/zeroTest.m	Thu Sep 07 09:21:04 2017 +0200
@@ -32,6 +32,22 @@
             {[1 2],[2 1]},
             {[0 0],[0];[0 0; 0 0],[0; 0]};
         },
+        {
+            {[3],[0]},
+            {zeros(3,0)},
+        },
+
+        {
+            {[0],[3]},
+            {zeros(0,3)},
+        },
+        {
+            {[0 2],[0 3]},
+            {
+                zeros(0,0), zeros(0,3);
+                zeros(2,0), zeros(2,3);
+            },
+        },
     };
 
     for i = 1:length(cases)