Mercurial > repos > public > sbplib
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