コードのパフォーマンスの高速化

조회 수: 15 (최근 30일)
N/A
N/A 2018년 8월 13일
댓글: N/A 2018년 8월 18일
下記のようなプログラムを作成しましたが、実行が完了するのに時間がかかりすぎてしまいます。どのようにプログラムを修正したら、時間が短縮されますか? M5を求める式は正しいものとします。
k=deg2rad(62.5);
m=-log(2)/log(cos(k));
wx=10;
wy=10;
fov=25;
H=2.5;
i=1;
j=1;
sita=deg2rad(45);
z = 0;
eor = zeros(0,91);
esitax = zeros(0,7687177771);
esitay = zeros(0,7687177771);
ex = zeros(0,7687177771);
ey = zeros(0,7687177771);
M5 = zeros(0,91);
for oR=0:1:90
eor(i)=oR;
minMRC5=100000;
for sitax=0:pi/180:pi/2
for sitay=0:pi/180:pi/2
for x=0:0.1:wx
for y=0:0.1:wy
esitax(j)=sitax;
esitay(j)=sitay;
ex(j)=x;
ey(j)=y;
OR=deg2rad(oR);
R11=-sin(-sitay)*cos(OR-sitax);
R12=-sin(OR-sitax);
R13=cos(-sitay)*cos(OR-sitax);
H1=sqrt((wx/2-x)^2+y^2+(H-z)^2);
%h11
cost11=(H-z)/H1;%cos(ΦT)
t11=acos(cost11);%ΦT
rad2t11=rad2deg(t11);
cosr11=(R11*(wx/2-x)+R12*(-y)+R13*(H-z))/H1;%cos(ΦR)
r11=acos(cosr11);%ΦR
rad2r11=rad2deg(r11);%ラジアンを度に変換する
if abs(rad2r11)>fov
cosr11=10e-6;
end
h11=((cost11^m)*cosr11)/(power(H1,2));
H2=sqrt((wx-x)^2+(wy/2-y)^2+(H-z)^2);
cost21=(H-z)/H2;%cos(ΦT)
t21=acos(cost21);%ΦT
rad2t21=rad2deg(t21);
cosr21=(R11*(wx-x)+R12*(wy/2-y)+R13*(H-z))/H2;%cos(ΦR)
r21=acos(cosr21);%ΦR
rad2r21=rad2deg(r21);%ラジアンを度に変換する
if abs(rad2r21)>fov
cosr21=10e-6;
end
h21=((cost21^m)*cosr21)/(power(H2,2));
H3=sqrt((wx/2-x)^2+(wy-y)^2+(H-z)^2);
cost31=(H-z)/H3;%cos(ΦT)
t31=acos(cost31);%ΦT
rad2t31=rad2deg(t31);
cosr31=(R11*(wx/2-x)+R12*(wy-y)+R13*(H-z))/H3;%cos(ΦR)
r31=acos(cosr31);%ΦR
rad2r31=rad2deg(r31);%ラジアンを度に変換する
if abs(rad2r31)>fov
cosr31=10e-6;
end
h31=((cost31^m)*cosr31)/(power(H3,2));
H4=sqrt(x^2+(wy/2-y)^2+(H-z)^2);
cost41=(H-z)/H4;%cos(ΦT)
t41=acos(cost41);%ΦT
rad2t41=rad2deg(t41);
cosr41=(R11*(-x)+R12*(wy/2-y)+R13*(H-z))/H4;%cos(ΦR)
r41=acos(cosr41);%ΦR
rad2r41=rad2deg(r41);%ラジアンを度に変換する
if abs(rad2r41)>fov
cosr41=10e-6;
end
h41=((cost41^m)*cosr41)/(power(H4,2));
H15=(1/(H^2));
COST21=H/sqrt((wx/2)^2+(wy/2)^2+H^2);
COSR25=10e-6;
H25=((COST21)^m*COSR25)/(((wx/2)^2+(wy/2)^2+H^2));
COST31=H/sqrt(wy^2+H^2);
COSR35=10e-6;
H35=((COST31)^m*COSR35)/(wy^2+H^2);
H45=H25;
H5=(H15+H25+H35+H45)^2;
H111=h11+h21+h31+h41;
SNRMRC5 = 10*log10((H111^2)/H5);
if SNRMRC5<=minMRC5
minMRC5=SNRMRC5;
end
j=j+1;
end
end
end
end
M5(i)=minMRC5;
i=i+1;
end
plot(eor,M5,'Color',[0.1010, 0.7, 0.933],'LineWidth',2.5);

채택된 답변

mizuki
mizuki 2018년 8월 13일
今回の場合,forループがたくさんあるのでおそらくそこに時間がかかっていると考えられます.実際にどの行が改善できそうなのか,まずはプロファイラを使って時間のかかっている箇所を探してみてください.プロファイラは
>> profile viewer
で起動,あるいはエディタタブの「実行および時間の計測」を実行して起動します.
これにより,各行の評価回数と,かかっている時間のレポートが生成されます. 数分レベルで時間がかかるものであれば,まずはループの回数を小さくして試してみてください.
ループの中で一つ一つ計算しているところはベクトル化(行列化)すると高速化できそうです.ベクトル化についてはこちらのビデオをご覧ください.

추가 답변 (2개)

Jiro Doke
Jiro Doke 2018년 8월 14일
推測ですが、 zeros で事前割り当てをしてますが、大きさ0の変数を割り当ててますので効果が見れないのかもしれません。
eor = zeros(0,91);
ではなく
eor = zeros(1,91);
のように変更してみてください。
  댓글 수: 3
Jiro Doke
Jiro Doke 2018년 8월 16일
Mizukiさんの回答にある手順に沿ってプロファイリングを行ってみてください。するとどの行に時間がかかっているかが分かりますので、その情報を記載してみてください。
N/A
N/A 2018년 8월 18일
了解しました。

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


Atsushi Matsumoto
Atsushi Matsumoto 2018년 8월 17일
5重のFor Loopがあって、それぞれ結構大きなループ回数なのでかなりの計算時間がかかりますね。 &nbsp
ループ回数を減らすようにステップサイズを大きく取るわけには行きませんか?
例えば for sitay=0:pi/90:pi/2 といったように。
&nbsp
また、Forループをベクター化すると速くなるかもしれません。
  댓글 수: 1
N/A
N/A 2018년 8월 18일
正確な理論検討をしたいので、スッテプサイズは細かく取らなければならないのですよ。

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

카테고리

Help CenterFile Exchange에서 プログラミング에 대해 자세히 알아보기

제품


릴리스

R2017a

Community Treasure Hunt

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

Start Hunting!