Overlaying several matrices diagonally to create a larger matrix

조회 수: 2 (최근 30일)
Edvardas
Edvardas 2014년 11월 10일
편집: Chris Dan 2019년 11월 10일
Hello,
I am currently struggling to figure a way out to connect around 10-12 8x8 matrices diagonally in a way as shown in this image
Where essentially the corner 4x4 from the 8x8 matrix would be overlayed diagonally. Everything else in the final matrix is to be zero.
Hence was wondering if anyone has any experience of forming matrices like this and perhaps would be able to help.
So far the only solution I have figured out is basically this:
% 8x8 matrix
m = (miu*l/420).*[156 0 0 22*l 54 0 0 -13*l;...
0 156 -22*l 0 0 54 13*l 0;...
0 -22*l 4*l^2 0 0 -13*l -3*l^2 0;...
22*l 0 0 4*l^2 13*l 0 0 -3*l^2;...
54 0 0 13*l 156 0 0 -22*l;...
0 54 -13*l 0 0 156 22*l 0;...
0 13*l -3*l^2 0 0 22*l 4*l^2 0;...
-13*l 0 0 -3*l^2 -22*l 0 0 4*l^2];
%miu and l varies, so m = m1; m2 m3... etc.
%create large matrix of zeros
M=zeros(52);
M(1:8,1:8)=m1;
M(5:12, 5:12) = m2;
M(9:16, 9:16) = m3;
M(13:20, 13:20) = m4;
M(17:24, 17:24) = m5;
M(21:28, 21:28) = m6;
M(25:32, 25:32) = m7;
M(29:36, 29:36) = m8;
M(33:40, 33:40) = m9;
M(37:44, 37:44) = m10;
M(41:48, 41:48) = m11;
M(45:52, 45:52) = m12;
Which I think is a very crude solution and for large matrices is not feasible, was thinking of somehow introducing a loop to do it automatically (in which case would also need to figure how to calculate the necessary size for the zeros matrix). So yeah, perhaps someone will know a trick or two.
Kind regards, Edvardas

채택된 답변

Orion
Orion 2014년 11월 10일
편집: Orion 2014년 11월 10일
% Assuming all your m1,m2,...,m12 variables exist and are size 8x8
NumberOfSubMat = 12;
% Initialize M
M=zeros(4+4*NumberOfSubMat);
for i = 1:NumberOfSubMat
index = (1:8)+4*(i-1);
M(index,index) = eval(['m' num2str(i)]);
end
Note : the use of eval is not optimized.
Instead of createing a lot of data m1,...,m100, you should create a cell array, which component being your varying 8x8 array.
m{1} = (miu*l/420).*[156 0 0 22*l 54 0 0 -13*l;...
0 156 -22*l 0 0 54 13*l 0;...
0 -22*l 4*l^2 0 0 -13*l -3*l^2 0;...
22*l 0 0 4*l^2 13*l 0 0 -3*l^2;...
54 0 0 13*l 156 0 0 -22*l;...
0 54 -13*l 0 0 156 22*l 0;...
0 13*l -3*l^2 0 0 22*l 4*l^2 0;...
-13*l 0 0 -3*l^2 -22*l 0 0 4*l^2];
m{2} = ...
m{12} = ...
and so, you can do a cleaner loop
for i = 1:NumberOfSubMat
index = (1:8)+4*(i-1);
M(index,index) = m{i};
end
  댓글 수: 2
Edvardas
Edvardas 2014년 11월 10일
That looks perfect. Thank you! And thanks for the cell array suggestion, that does seem to be more reasonable.
Chris Dan
Chris Dan 2019년 11월 10일
편집: Chris Dan 2019년 11월 10일
Hello, I also want to construct diagnoal matrix like this, but my matrices are 12x12 and the over lap is of last 6 columns.
What changes do I have to make for it than?

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by