Transfer values of Matrix to a specific Position in another Matrix
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Sven Markus
am 7 Nov. 2021
Kommentiert: Matt J
am 8 Nov. 2021
Hello,
I have different matrices (all 4x4) that get created by a for loop. I want to add the values of these matrices to specific positions of another matrix (8x8). To give you thematic context: The 5 matrices (4x4) are stifness matrices of each element of a truss system and I want to add them up to get the stiffness matrix of the whole truss system (2D).
Here as an example on how I want to arange the values of the first matrix:
K_l = [1:4; 5:8; 9:12; 13:16]
K_test = zeros(8,8)
K_test(1:2,1:2)=K_l(1:2,1:2)
K_test(5:6,1:2)=K_l(3:4,1:2)
K_test(1:2,5:6)=K_l(1:2,3:4)
K_test(5:6,5:6)=K_l(3:4,3:4)
Is there a way to fill the matrix "smarter"? Maybe in the loop itself?
These are the 5 matrices I'm creating and all of those I want to rearange in a matrix of 8 x 8:
L = 13; % [m]
Theta_1 = 15; % [°]
Theta_2 = Theta_1+15;
A_hat = 500*10^-6; % [m^2]
A_AB = A_hat;
A_BD = A_AB;
A_AC = 2*A_hat;
A_CD = A_AC;
A_BC = 3*A_hat;
phi_v = [30; -30; -90; 15; -15] % [%]
A_v = [A_AC; A_CD; A_BC; A_AB; A_BD] % [m^2]
E = 2.1*10^11;
L_1 = L/(cosd(Theta_2)*2); % [m]
L_2 = L_1;
L_3 = L/2*(tand(Theta_2)-tand(Theta_1));
L_4 = L/(cosd(Theta_1)*2);
L_5 = L_4;
L_v = [L_1; L_2; L_3; L_4; L_5]
for i = 1:5
K_l = [cosd(phi_v(i))^2 cosd(phi_v(i))*sind(phi_v(i)) -cosd(phi_v(i))^2 -cosd(phi_v(i))*sind(phi_v(i));
cosd(phi_v(i))*sind(phi_v(i)) sind(phi_v(i))^2 -cosd(phi_v(i))*sind(phi_v(i)) -sind(phi_v(i))^2;
-cosd(phi_v(i))^2 -cosd(phi_v(i))*sind(phi_v(i)) cosd(phi_v(i))^2 cosd(phi_v(i))*sind(phi_v(i));
-cosd(phi_v(i))*sind(phi_v(i)) -sind(phi_v(i))^2 cosd(phi_v(i))*sind(phi_v(i)) sind(phi_v(i))^2];
K_l = ((E*A_v(i))/L_v(i))*K
end
Best Regards
2 Kommentare
dpb
am 7 Nov. 2021
Create set of indices to the starting location of each to use as lookup in the loop.
Not exactly sure where each goes from the above description; looks like they may actually be split and not contiguous from the initial example? If that is so, then need to have the pointers to the subspaces, not just the start. In that case it might well be simpler to not generate the full array but the individual pieces that are contiguous instead...
K_l = ...
[cosd(p(i))^2 cosd(p(i))*sind(p(i)) -cosd(p(i))^2 -cosd(p(i))*sind(p(i));
cosd(p(i))*sind(p(i)) sind(p(i))^2 -cosd(p(i))*sind(p(i)) -sind(p(i))^2;
-cosd(p(i))^2 -cosd(p(i))*sind(p(i)) cosd(p(i))^2 cosd(p(i))*sind(p(i));
-cosd(p(i))*sind(p(i)) -sind(p(i))^2 cosd(p(i))*sind(p(i)) sind(p(i))^2];
I shortened variable name down to just p for the angle and lined the terms up for legibility -- now which pieces go where in the end?
One can also create temporaries for the terms that are recomputed; a first step in that direction is--
cd=cosd(p(i));
sd=sind(p(i));
K_l = ...
[sd.^2 cd*sd -cd.^2 -cd*sd;
cd*sd sd.^2 -cd*sd -sd.^2;
-cd.^2 -cd*sd cd.^2 cd*sd;
-cd*sd -sd.^2 cd*sd sd.^2];
The products and squared terms could also be precomputed and just substituted as well.
Akzeptierte Antwort
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Surrogate Optimization finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!