Combining 3 for loops into 1 in Matlab

조회 수: 1 (최근 30일)
Aftab Ahmed Khan
Aftab Ahmed Khan 2016년 2월 25일
댓글: Star Strider 2016년 2월 26일
I have this section of code which is working fine but i don't like the way i have implemented those 3 separate for loops. Can anyone suggest to me that how can i merge them together to make it even more efficient and compact ? Thank you
clear variables;
close all;
clc;
ilambda=5;
mu=2;
n=2;
jmax=n+1;
P= sym('P',[jmax,jmax]);
for j1 = 1:jmax
for j2 = 2:jmax-1
[c1,c2,c3,c4,c5]=coefficients(ilambda,mu,j1,j2);
if j1<jmax
E(j1, j2) = c1*P(j1, j2) - c2 * P(j1+1, j2) - c3 * P(j1, j2+1) - c4 * P(j1, j2-1);
else
E(j1, j2) = c1 * P(j1, j2) - c3 * P(j1, j2+1) - c4 * P(j1, j2-1);
end
end
end
j2=1;
for j1=1:jmax;
[c1,c2,c3,c4,c5]=coefficients(ilambda,mu,j1,j2);
if (j1<jmax)
E(j1, j2) = c1*P(j1, j2) - c2 * P(j1+1, j2) - c3 * P(j1, j2+1);
else
E(j1, j2) = c1*P(j1, j2) - c3 * P(j1, j2+1);
end
end
j2=jmax;
for j1=1:jmax;
[c1,c2,c3,c4,c5]=coefficients(ilambda,mu,j1,j2);
if (j1==1)
E(j1, j2) = c1*P(j1, j2) - c2 * P(j1+1, j2) - c4 * P(j1, j2-1);
elseif (j1==jmax)
c1=((j1-1)*mu)+((j2-1)*mu);
E(j1, j2) = c1 * P(j1, j2) - c4 * P(j1, j2-1) - c5 * P(j1-1, j2);
else
E(j1, j2) = c1*P(j1, j2) - c2 * P(j1+1, j2)- c4 * P(j1, j2-1)- c5 * P(j1-1, j2);
end
end
  댓글 수: 5
Aftab Ahmed Khan
Aftab Ahmed Khan 2016년 2월 26일
편집: Aftab Ahmed Khan 2016년 2월 26일
Hi, I think your guess is right. The way i am approaching this problem is like this but i can't map those coefficients in a right order. I want to map them like the table given below.
clear variables;
close all;
clc;
jmax=3;
mu=2;
ilambda=5;
C=zeros(jmax^2);
for j1=1:jmax
for j2=1:jmax
switch j2
case 1
c1=ilambda+((j1-1)*mu)+((j2-1)*mu);
c2=(((j1-1)+1)*mu);
c3=(((j2-1)+1)*mu);
c4=ilambda;
c5=ilambda;
if (j1<jmax)
C(j1,j2)=c1;
C(j1+1,j2)=c2;
C(j1,j2+1)=c3;
else
C(j1,j2)=c1;
C(j1,j2+1)=c3;
end
case jmax
c1=ilambda+((j1-1)*mu)+((j2-1)*mu);
c2=(((j1-1)+1)*mu);
c3=(((j2-1)+1)*mu);
c4=ilambda;
c5=ilambda;
if (j1==1)
C(j1,j2)=c1;
C(j1+1,j2)=c2;
C(j1,j2-1)=c4;
elseif (j1==jmax)
c1=((j1-1)*mu)+((j2-1)*mu);
C(j1,j2)=c1;
C(j1,j2-1)=c4;
C(j1-1,j2)=c5;
else
C(j1,j2)=c1;
C(j1+1,j2)=c2;
C(j1,j2-1)=c4;
C(j1-1,j2)=c5;
end
otherwise
c1=ilambda+((j1-1)*mu)+((j2-1)*mu);
c2=(((j1-1)+1)*mu);
c3=(((j2-1)+1)*mu);
c4=ilambda;
c5=ilambda;
if j1<jmax
C(j1,j2)=c1;
C(j1+1,j2)=c2;
C(j1,j2+1)=c3;
C(j1,j2-1)=c4;
else
C(j1,j2)=c1;
C(j1,j2+1)=c3;
C(j1,j2-1)=c4;
end
end
end
end
Star Strider
Star Strider 2016년 2월 26일
The matrix you created looks as though it will work. It may seem awkward code, but if it maps your coefficients correctly, and is faster and more efficient than using the Symbolic Math Toolbox, that’s likely the best you can hope for. It solves the problem of getting the coefficients in the correct order, because you’re mapping them directly to your matrix. Conditional statements are difficult to make into efficient, vectorised code.
If it works, go with it!

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

답변 (0개)

카테고리

Help CenterFile Exchange에서 Creating and Concatenating Matrices에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by