replace part of matrix to another matrix

11 visualizzazioni (ultimi 30 giorni)
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

Risposta accettata

Stephen23
Stephen23 il 18 Nov 2017
Modificato: Stephen23 il 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 Commento
mohammed hussein
mohammed hussein il 19 Nov 2017
thank you very much for your answer , this is exactly what i want

Accedi per commentare.

Più risposte (2)

Walter Roberson
Walter Roberson il 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 il 18 Nov 2017
Modificato: Andrei Bobrov il 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

Categorie

Scopri di più su Matrices and Arrays in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by