Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
LRT_infinite_dimensional_systems
conI
Commits
fcfe4b03
Commit
fcfe4b03
authored
Oct 30, 2020
by
Jakob Gabriel
Browse files
misc.kronColumnwise: new method
parent
30b279fb
Changes
2
Hide whitespace changes
Inline
Side-by-side
+misc/kronColumnwise.m
0 → 100644
View file @
fcfe4b03
function
C
=
kronColumnwise
(
A
,
B
,
AcolumnSize
,
BcolumnSize
)
% misc.kronColumnwise calculates a modified Kronecker product for block matrices defined by
% [kron(A_11, B_1) kron(A_12, B_2) ... kron(A_1r, B_r) ]
% C = [ ... ... ... ... ]
% [kron(A_r1, B_1) kron(A_r2, B_2) ... kron(A_rr, B_r) ]
%
% or equally
% C = [kron(A_1, B_1) kron(A_2, B_2) ... kron(A_r, B_r) ]
%
% Therein,
% r: number of blocks, i.e. r = numel(AcolumnSize) = numel(BcolumnSize)
% A_i: The sub-matrix of A resulting by evaluating its
% columns sum(AcolumnSize(i-1) + (1:AcolumnSize(i)
% -> A = [ A_1 A_2 ... A_r ]
% B_i: The sub-matrix of B resulting by evaluating its
% columns sum(BcolumnSize(i-1) + (1:BcolumnSize(i)
% -> B = [ B_1 B_2 ... B_r ]
%
% C = misc.kronColumnwise(A, B, AcolumnSize, BcolumnSize) calculates the product defined above.
% AcolumnSize, and BcolumnSize resepectivly, define how many columns AcolumnSize(i) belong to
% the i-th componenent A_i.
%
% C = misc.kronColumnwise(A, B) calculates the usual Kronecker product
%
%%
% Example
% A = [1, 2; 3, 4]
% B = [1, 2, 3]
% C = misc.kronColumnwise(A, B, [1, 1], [1, 2])
arguments
A
(:,
:);
B
(:,
:);
AcolumnSize
(:,
1
)
double
=
size
(
A
,
2
);
BcolumnSize
(:,
1
)
double
=
size
(
B
,
2
);
end
% arguments
assert
(
sum
(
AcolumnSize
)
==
size
(
A
,
2
),
...
"The sum of AcolumnSize must be equal to the number of columns of A"
);
assert
(
sum
(
BcolumnSize
)
==
size
(
B
,
2
),
...
"The sum of BcolumnSize must be equal to the number of columns of B"
);
assert
(
isequal
(
numel
(
AcolumnSize
),
numel
(
BcolumnSize
)),
...
"AcolumnSize and BcolumnSize must have same number of elements, because there need to be "
...
+
"same number of sub-matrices for A and B"
);
Ccell
=
cell
(
size
(
AcolumnSize
));
for
it
=
1
:
numel
(
AcolumnSize
)
Ccell
{
it
}
=
kron
(
...
A
(:,
sum
(
AcolumnSize
(
1
:
it
-
1
))
+
(
1
:
AcolumnSize
(
it
))),
...
B
(:,
sum
(
BcolumnSize
(
1
:
it
-
1
))
+
(
1
:
BcolumnSize
(
it
))));
end
% for it = 1 : numel(AcolumnSize)
C
=
cat
(
2
,
Ccell
{:});
end
% misc.kronColumnwise()
\ No newline at end of file
+unittests/+misc/testKronColumnwise.m
0 → 100644
View file @
fcfe4b03
function [tests] = testKronColumnwise()
tests = functiontests(localfunctions);
end
function testKron(tc)
A = 1:1:(2^2); A = reshape(A, sqrt(numel(A)) * [1, 1]);
B = magic(2);
tc.verifyEqual(misc.kronColumnwise(A, B), kron(A, B));
end % testKron()
function testBVector(tc)
A = [1, 2; 3, 4];
A11 = A(1, 1);
A12 = A(1, 2);
A21 = A(2, 1);
A22 = A(2, 2);
B = [1, 2, 3];
B1 = B(1, 1);
B2 = B(1, [2, 3]);
tc.verifyEqual(misc.kronColumnwise(A, B, [1, 1], [1, 2]), ...
[kron(A11, B1), kron(A12, B2); kron(A21, B1), kron(A22, B2)])
end % testBVector()
function testMatrix(tc)
A = 1:1:(4^2); A = reshape(A, sqrt(numel(A)) * [1, 1]);
A11 = A(1:2, 1:2);
A12 = A(1:2, 3:4);
A21 = A(3:4, 1:2);
A22 = A(3:4, 3:4);
B = [1, 2, 3; 4, 5, 6]+2;
B1 = B(:, 1);
B2 = B(:, [2, 3]);
tc.verifyEqual(misc.kronColumnwise(A, B, [2, 2], [1, 2]), ...
[kron(A11, B1), kron(A12, B2); kron(A21, B1), kron(A22, B2)])
end % testMatrix()
\ No newline at end of file
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment