replace part of matrix to another matrix

9 views (last 30 days)
Hi i have many matrices in same size , i want to add all of them together in one matrix with replace the last quarter of each one to binning of next one until complete the matrix and the rest will be zeros . for example
a =zeros(5,5)
A=[1 2 ;3 4];
B=[5 6;7 8];
C=[9 10;11 12];
D=[13 14;15 16];
the answer
a=
1 2 0 0 0
3 5 6 0 0
0 7 9 10 0
0 0 11 13 14
0 0 0 15 16
thank you very much for helping

Accepted Answer

Stephen23
Stephen23 on 18 Nov 2017
Edited: Stephen23 on 18 Nov 2017
For any size matrices, even combinations of different sizes:
C = {[1,2;3,4],[5,6;7,8],[9,10;11,12],[13,14;15,16]};
num = numel(C);
szr = cellfun('size',C,1);
szc = cellfun('size',C,2);
csr = cumsum([0,szr-1]);
csc = cumsum([0,szc-1]);
M = zeros(1+csr(end),1+csc(end));
for k = 1:num
idr = csr(k)+(1:szr(k));
idc = csc(k)+(1:szc(k));
M(idr,idc) = C{k};
end
Giving:
>> M
M =
1 2 0 0 0
3 5 6 0 0
0 7 9 10 0
0 0 11 13 14
0 0 0 15 16
It works perfectly with any size matrices, e.g.:
C = {[1,2;3,4],[5,6;7,8],[1,2,3;4,5,6;7,8,9],[9,10;11,12],[13,14;15,16]};
gives
M =
1 2 0 0 0 0 0
3 5 6 0 0 0 0
0 7 1 2 3 0 0
0 0 4 5 6 0 0
0 0 7 8 9 10 0
0 0 0 0 11 13 14
0 0 0 0 0 15 16
  1 Comment
mohammed hussein
mohammed hussein on 19 Nov 2017
thank you very much for your answer , this is exactly what i want

Sign in to comment.

More Answers (2)

Walter Roberson
Walter Roberson on 18 Nov 2017
A=[1 2 ;3 4];
B=[5 6;7 8];
C=[9 10;11 12];
D=[13 14;15 16];
newvals = {A, B, C, D};
a = zeros(5,5);
for K = 1 : length(newvals)
a(K:K+1, K:K+1) = newvals{K};
end

Andrei Bobrov
Andrei Bobrov on 18 Nov 2017
Edited: Andrei Bobrov on 18 Nov 2017
In your case (without loop)
k = cat(3,A,B,D,C);
[m,n,q] = size(k);
a = full(gallery('tridiag',q*m/2+1,1,1,1));
ii = ((1:m*n-1) + (0:q-1)'*m*n)';
a(a>0) = k([ii(:);prod([m,n,q])]);
in general case (with for..end loop)
C = {[1,2;3,4],[5,6;7,8],[1,2,3;4,5,6],[9,10;11,12],[13,14;15,16]};
[m,n] = cellfun(@(x)size(x),C(:));
s = sum(m-1) + 1;
a = zeros(s,sum(n-1)+1);
jj = 1;
for ii = 1:numel(m)
id = jj + (0:m(ii)-1)' + s*(0:n(ii)-1);
a(id) = C{ii};
jj = id(end);
end
All for MATLAB >= R2016b

Community Treasure Hunt

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

Start Hunting!