What is wrong with my for loop?

1 Ansicht (letzte 30 Tage)
Kyle McLaughlin
Kyle McLaughlin am 28 Okt. 2020
Kommentiert: madhan ravi am 29 Okt. 2020
%check for stitching global nxn matrix
elements = 4;
nodes = 5; %nodes
s=3; %size of matrix nxn
k=[1 1 1; 1 1 1; 1 1 1];
size = (s* elements) - (elements-1);
K = zeros(size,size);
K(1:s,1:s) = k(1:s,1:s);
%this fills the matrix with values
for i =2:elements-1
% K((s:((i*s)-(i-1))), (s:((i*s)-(i-1)))) = k(1:s,1:s);
for j = 1:elements-1
K((j*s-j-1):(i*s-i-1), (j*s-j-1):(i*s-i-1)) = k(1:s,1:s);
end
% K((s:((2*s)-(2-1))), (s:((2*s)-(2-1)))) = k(1:s,1:s);
% K((s:((3*s)-(3-1))), (s:((3*s)-(3-1)))) = k(1:s,1:s);
%K(s:((j*s)-(j-1)),s:((j*s)-(j-1))) = k(1:s,1:s);
% K(s:5,s:5) = k(1:s,1:s);
% K(5:7,5:7) = k(1:s,1:s);
% K(7:9,7:9) = k(1:s,1:s);
end
%this adds matrix elements at stitching location
for i = 1:elements-1
K(((i*s)-(i-1)), ((i*s)-(i-1))) = k(1,1)+k(s,s);
end
K
the lines including K(s:5,s:5) to K(7:9,7:9) was my verification to see if the matrix was right and it is. the code above in the for loops should give me the same answers as these but I keep getting an error saying unable to perform assignment because the size of the left matrix doesnt match the right
this is the error I recieve:
Unable to perform assignment because the size of the left side is 1-by-1 and the size of the right side is
3-by-3.
  4 Kommentare
Kyle McLaughlin
Kyle McLaughlin am 28 Okt. 2020
I deleted it to post it correctly so there would be no further confusion
Kyle McLaughlin
Kyle McLaughlin am 29 Okt. 2020
Bearbeitet: Kyle McLaughlin am 29 Okt. 2020
I was able to come up with the following code which is closer to what I want but doesnt quite fit:
elements = 4;
nodes = 5; %nodes
s=3; %size of matrix nxn
k=[1 1 1; 1 1 1; 1 1 1];
size = (s* elements) - (elements-1);
K = zeros(size,size);
%K(1:s,1:s) = k(1:s,1:s);
for j = 2:elements
for ii = 0: elements -2
%K(j*s-s+ii*(s-1):j*s-1+ii*(s-1), j*s-s+ii*(s-1):j*s-1+ii*(s-1)) = k(1:s,1:s);
%K(j*s-s-1:j*s-1, j*s-s-1:j*s-1) = k(1:s,1:s);
K(j*s-s-ii:j*s-1-ii,j*s-s-ii:j*s-1-ii)= k(1:s,1:s);
end
end
%K(size-s+1:size,size-s+1:size) = k(1:s,1:s);
for i = 1:elements-1
K(((i*s)-(i-1)), ((i*s)-(i-1))) = k(1,1)+k(s,s);
end
K
K =
1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0
1 1 2 1 1 0 0 0 0 0 0
0 1 1 1 1 1 0 0 0 0 0
0 0 1 1 2 1 1 0 0 0 0
0 0 0 1 1 1 1 1 0 0 0
0 0 0 0 1 1 2 1 1 0 0
0 0 0 0 0 1 1 1 1 1 0
0 0 0 0 0 0 1 1 1 1 1
0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0 1 1 1

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Kyle McLaughlin
Kyle McLaughlin am 29 Okt. 2020
elements = 4;
s=3; %size of matrix nxn
k=[1 1 1; 1 1 1; 1 1 1];
length = (s* elements) - (elements-1);
K = zeros(length,length);
for j = 0:elements-1
index =(1:s);
n = index + j*(s-1);
K(n,n) = k(1:s,1:s);
end
for i = 1:elements-1
K(((i*s)-(i-1)), ((i*s)-(i-1))) = k(1,1)+k(s,s);
end
K
This does exactly what I want I answered my own question nevermind. Here it is for reference.
  3 Kommentare
Kyle McLaughlin
Kyle McLaughlin am 29 Okt. 2020
Excuse me, clearly i didnt see any answer you posted which is why it was deleted. Sorry you didnt answer my question and get an accepted answer. I am aware of how it works now, dont beat a dead horse.
madhan ravi
madhan ravi am 29 Okt. 2020
Lol, good luck

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Matt J
Matt J am 28 Okt. 2020
Bearbeitet: Matt J am 28 Okt. 2020
It seems clear that when i=j, the left hand side of
K((j*s-j-1):(i*s-i-1), (j*s-j-1):(i*s-i-1)) = k(1:s,1:s);
will be 1x1 whereas the right hand side will always be 3x3. Generally speaking, the size of the left hand side is changing in a highly i,j-dependent way whereas the right hand side is not.
  3 Kommentare
Matt J
Matt J am 29 Okt. 2020
I'm not sure what you are trying to achieve. If the idea is just to make tiled copies of k, then youcould just use repmat
K=repmat(k,elements,elements)
Kyle McLaughlin
Kyle McLaughlin am 29 Okt. 2020
Bearbeitet: Kyle McLaughlin am 29 Okt. 2020
This is the begining of an FEA script, the code that I am writing here assembles the global stiffness matrix from the element matricies. I need to apply this to the mass matrix and damping matrix for nxn size so that it is modular in the event of different sized element matrixies for given element types. The goal is to add the first and lass matrix values which creates the nodal connection between the two elements and apply that to the lot of them. The first comment I made in the post, directly under my question, shows the desired results of the matrix.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Produkte


Version

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by