How do I avoid using if and else statements in this code
조회 수: 4 (최근 30일)
이전 댓글 표시
I want to rewrite this code but without if and else statements. I just want to enhance convergence rate
for i=1:N-1
for j=1:M-1
A(i+(M-1-j)*(N-1),i+(M-1-j)*(N-1))=-2/dx^2-2/dy^2;
B(i+(M-1-j)*(N-1))=B(i+(M-1-j)*(N-1))-(cos(x(i)+y(j))+cos(x(i)-y(j)));
if i==1
B(i+(M-1-j)*(N-1))=B(i+(M-1-j)*(N-1))-cos(y(j))/dx^2;
else
A(i+(M-1-j)*(N-1),i-1+(M-1-j)*(N-1))=1/dx^2;
end
end
end
댓글 수: 3
Ameer Hamza
2020년 5월 1일
Can you write down the equation you are trying to implement with these for loops?
채택된 답변
Vimal Rathod
2020년 5월 5일
Hi,
If your main goal is to remove the if else statements from the code, you can write the following code first and then write the main for loop with i starting from 2 instead on one and remove the if statement and keep the statement in the else condition.
i = 1;
for j=1:M-1
A(i+(M-1-j)*(N-1),i+(M-1-j)*(N-1))=-2/dx^2-2/dy^2;
B(i+(M-1-j)*(N-1))=B(i+(M-1-j)*(N-1))-cos(y(j))/dx^2;
end
for i=2:N-1
for j=1:M-1
A(i+(M-1-j)*(N-1),i+(M-1-j)*(N-1))=-2/dx^2-2/dy^2;
B(i+(M-1-j)*(N-1))=B(i+(M-1-j)*(N-1))-(cos(x(i)+y(j))+cos(x(i)-y(j)));
A(i+(M-1-j)*(N-1),i-1+(M-1-j)*(N-1))=1/dx^2;
end
end
if you want to further optimize you can vectorize the first loop.
Hope this helps!
댓글 수: 6
Rik
2020년 5월 7일
I wouldn't personally care how my code would solve the equations. The more time you put in, the more you can optimize your code. At some point you get to a stage where you need to put in an unreasonable amount of time. Then I would stop.
Are you really sure you simply want to avoid an if/else block? That doesn't make sense to me.
What toolboxes relating to diff equations do you have available?
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 PDE Solvers에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!