How do I reduce the running time of this program
1 回表示 (過去 30 日間)
古いコメントを表示
function [f , t] = jacobi1(n)
tic;
if n < 4
error ('n not in the range')
end
if rem(n,1)~=0
error ('n has to be a whole mumber')
end
n=n^2;
b=zeros(n,1);
b(1,1)=1;
b(n,1)=1;
A = zeros(n,n);
mymatrix=[-1 0 -1 4 -1 0 -1];
for i=1:3
A(i,1:i+3)=mymatrix(5-i:7);
A(n-(3-i),n-(6-i):n)=mymatrix(1:7-i);
end
for i=4:n-3
A(i,i-3:i+3) = mymatrix;
end
epsilon = 1e-3;
f = zeros(n,1);
counter = 0;
flag = 0;
L = tril(A,-1);
D = diag(A);
U = triu(A,1);
B = -1./D.*(L+U);
C = (1./D).*b;
while flag == 0
counter = counter+1;
if counter > 10000
error ('Too many iteration')
end
f_n = (B*f) + C;
if max(abs(f_n-f)/(f_n))<epsilon
flag = 1;
else
f = f_n;
end
end
t=toc;
end
0 件のコメント
回答 (2 件)
Saurav Chaudhary
2020 年 12 月 22 日
Here is the link to best practices that can be followed to improve performance. You may find it helpful.
0 件のコメント
Jan
2020 年 12 月 22 日
編集済み: Jan
2020 年 12 月 22 日
The profiler shows, that almost the complete time is spent in this line:
if max(abs(f_n - f) / f_n) < epsilon
Are you sure, that this calculates what you expect? For n=5, abs(f_n - f) / f_n is a 25x25 matrix. Using the max function replies a vector and to provide a scalare condition for the if command Matlab inserts an all() implicitly. Is this, what you want? Or maybe:
if max(abs((f_n - f) ./ f_n)) < epsilon
This is much faster, but another criterion and the results of the function are different.
Yur code does not contain meaningful comments, which explain, what you want to calculate. Then it is hard to guess, if you have implemente what was intented.
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Scope Variables and Generate Names についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!