multiply a matrix into every block matrix in a big matrix

Hi there,
Here I want to multiply a matrix H into every block matrix Aij in the matrix A, i.e.,
Are there any codes can realize this? so I do not need to repeat the manipulation of the multiplication.
Best regards

 Accepted Answer

You can download this package,
Example:
Hc=[1,2;3,4];
A=kron(ones(3),eye(2)); %2x2 blocks Aij
dims=[2,2]; %block dims
tmp=Hc*blkColonTranspose(A,dims);
result=blkReshape(tmp,dims,blkSize(A,dims))
result =
1 2 1 2 1 2
3 4 3 4 3 4
1 2 1 2 1 2
3 4 3 4 3 4
1 2 1 2 1 2
3 4 3 4 3 4

3 Comments

Hi Matt,
Now I tried another case where Hc is not square:
Hc = rand( 6 , 12 ) ;
A = kron( ones( 6 ) , eye( 12 ) ) ; %2x2 blocks Aij
dims=[ 12 , 12 ] ; %block dims
tmp=Hc*blkColonTranspose(A,dims)
result=blkReshape(tmp,dims,blkSize(A,dims))
Then in the command window, it says
The input array does not divide evenly into tiles of the specified size.
So how to handle this issue?
Many thanks!
Stanley
My other answer will handle this case as is, or you could do,
tmp=Hc*blkColonTranspose(A,[12,12]);
result=blkReshape(tmp,[6,12],blkSize(A,[12,12]))
Matt, you are so excellent! I just wonder how I can be as skilled as U in Matlab!

Sign in to comment.

More Answers (2)

Hc=[1,2;3,4];
A=kron(ones(3),eye(2)); %2x2 blocks Aij
blockheight=2;
result=reshape( Hc*reshape(A,blockheight,[]) , [],width(A))
result = 6×6
1 2 1 2 1 2 3 4 3 4 3 4 1 2 1 2 1 2 3 4 3 4 3 4 1 2 1 2 1 2 3 4 3 4 3 4
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
Check out blockproc.
Example data
H = [1,2;3,4];
rng(100);
A = rand(4,6);
Result
R = blockproc(A,[2 2],@(B) H*B.data)
R = 4×6
1.1001 0.2479 1.2869 0.4021 1.1556 2.3118 2.7437 0.5004 2.7105 0.9895 3.1228 5.0552 2.1141 2.3225 1.3097 2.1769 1.3644 1.4899 4.6527 5.3157 3.5108 4.5736 3.5450 3.7974
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
Check
isequal(R,[H*A(1:2,1:2),H*A(1:2,3:4),H*A(1:2,5:6);H*A(3:4,1:2),H*A(3:4,3:4),H*A(3:4,5:6)])
ans = logical
1

1 Comment

blockproc is quite slow, and is usually inadvisable.
H = [1,2;3,4];
rng(100);
A = randi(10,400,600);
tic;
R1 = blockproc(A,[2 2],@(B) H*B.data);
toc
Elapsed time is 0.490280 seconds.
tic;
R2=reshape( H*reshape(A,2,[]) , [],width(A));
toc;
Elapsed time is 0.001811 seconds.
Even cellfun would be better:
tic;
Acell=mat2cell(A,ones(200,1)*2,ones(300,1)*2);
R3=cell2mat(cellfun(@(B) H*B ,Acell,'uni',0));
toc
Elapsed time is 0.226868 seconds.
isequal(R1,R2,R3)
ans = logical
1

Sign in to comment.

Products

Asked:

on 27 Nov 2024

Commented:

on 28 Nov 2024

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!