changeset 208:40dda96c8c9c feature/grids

blockmatrix: Added function to convert regular matrix to blockmatrix.
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 15 Jun 2016 17:25:40 +0200
parents d521e17f72b6
children 4fc2631477a3
files +blockmatrix/fromMatrix.m +blockmatrix/fromMatrixTest.m
diffstat 2 files changed, 88 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
diff -r d521e17f72b6 -r 40dda96c8c9c +blockmatrix/fromMatrix.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+blockmatrix/fromMatrix.m	Wed Jun 15 17:25:40 2016 +0200
@@ -0,0 +1,24 @@
+function bm = fromMatrix(A, div)
+    d1 = div{1};
+    d2 = div{2};
+    [n, m] = size(A);
+    if n ~= sum(d1) || m ~= sum(d2)
+        error('blockmatrix:fromMatrix:NonMatchingDim','The dimensions in div does not sum to the dimensions in A.');
+    end
+
+    bm = cell(length(d1), length(d2));
+    I = 1;
+    for i = 1:length(d1)
+        J = 1;
+        for j = 1:length(d2)
+            Asub = A(I:(I + d1(i)-1), J:(J + d2(j)-1));
+            if nnz(Asub) == 0
+                bm{i,j} = [];
+            else
+                bm{i,j} = Asub;
+            end
+            J = J + d2(j);
+        end
+        I = I + d1(i);
+    end
+end
\ No newline at end of file
diff -r d521e17f72b6 -r 40dda96c8c9c +blockmatrix/fromMatrixTest.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+blockmatrix/fromMatrixTest.m	Wed Jun 15 17:25:40 2016 +0200
@@ -0,0 +1,64 @@
+function tests = fromMatrixTest()
+    tests = functiontests(localfunctions);
+end
+
+function testErrorNonMatchingDim(testCase)
+    in  = {
+        {magic(5), {[1 2 3], [4]}},
+        {magic(5), {[1 1 1 1 1 1], [5]}},
+        {magic(5), {[5], [1 1 1 1 1 1]}},
+        {ones(4,2),{[2 3],[2]}},
+        {ones(4,2),{[2 2],[3]}},
+    };
+
+    for i = 1:length(in)
+        testCase.verifyError(@()blockmatrix.fromMatrix(in{i}{:}),'blockmatrix:fromMatrix:NonMatchingDim');
+    end
+end
+
+function testFromMatrix(testCase)
+    cases = {
+        {
+            {[],{[],[]}},
+            {}
+        },
+        {
+            {
+                magic(3),
+                {[3],[3]}
+            },
+            {magic(3)}
+        },
+        {
+            {
+                magic(3),
+                {[1 1 1],[1 1 1]}
+            },
+            mat2cell(magic(3),[1 1 1],[1 1 1])
+        },
+        {
+            {
+                [17 24 1 8 15; 23 5 7 14 16; 4 6 13 20 22; 10 12 19 21 3; 11 18 25 2 9],
+                {[1 4],[2 3]}
+            },
+            {
+                [17 24], [1 8 15];
+                [23 5; 4 6; 10 12; 11 18], [7 14 16; 13 20 22; 19 21 3; 25 2 9];
+            };
+        },
+    };
+    for i = 1:length(cases)
+        out = convertToFull(blockmatrix.fromMatrix(cases{i}{1}{:}));
+        expected = cases{i}{2};
+        testCase.verifyEqual(out,expected);
+    end
+end
+
+function C = convertToFull(C)
+    [N,M] = size(C);
+    for i = 1:N
+        for j = 1:M
+            C{i,j} = full(C{i,j});
+        end
+    end
+end
\ No newline at end of file