forループに関する計算速度について
Ältere Kommentare anzeigen
簡単な数値計算をfor文で作成したのち、ある程度複雑化してくると計算時間が長くなってきます。
そんなときfor文を単純な配列計算になおすと速度向上される場合があるのですが、
計算速度がなぜそこまで変化するのかがわかりません。
例えば1×Nの配列Xについて各要素の二乗を計算してYに格納しようとしたとします。
その場合
Y=zeros(1,N);
for i=1,N
Y(i)=X(i)^2;
end
というコードを作成するのと
Y=X.*X
と計算するのでは計算速度はどのくらい早くなるのでしょうか。
またその速度差はmatlab上でどういった手順で計算することで発生しているのでしょうか。
Akzeptierte Antwort
Weitere Antworten (1)
Atsushi Ueno
am 15 Mai 2021
>計算速度はどのくらい早くなるのでしょうか。
単純に、MATLAB上で実行してみました
N = 10000000;
X = randi(N,[1,N]);
tic; for i = 1:N, Y(i) = X(i) ^ 2; end
toc;
tic; Y=X.*X; toc;
local PC(R2017a@windows)での実行結果
経過時間は 0.051485 秒です。
経過時間は 0.011703 秒です。
MATLAB online(R2021a@linux)での実行結果
経過時間は 0.222043 秒です。
経過時間は 0.038554 秒です。
実行時間は様々な条件で異なります。メカニズムを逐一解明すれば「こっちの方が何ステップ早くなる」と断言できますが、マルチタスクOS上では実行する度に上記時間が変動してしまい、理論通りの時間短縮を再現する事は出来ません。
>またその速度差はmatlab上でどういった手順で計算することで発生しているのでしょうか。
私自身がMATLABの手順を確認した事が無いので直接の回答を控えます。
下記はtimes.mの内容です。下記ソースコードはコメントのみで、実体はオブジェクトファイルとしてしか存在しないのでしょう。つまりMATLABに組み込まれた演算子のソースコードは閲覧できないと思います。
%.* Array multiply.
% X.*Y denotes element-by-element multiplication. X and Y must have
% compatible sizes. In the simplest cases, they can be the same size or
% one can be a scalar. Two inputs have compatible sizes if, for every
% dimension, the dimension sizes of the inputs are either the same or one
% of them is 1.
%
% C = TIMES(A,B) is called for the syntax 'A .* B' when A or B is an
% object.
%
% See also MTIMES.
% Copyright 1984-2015 The MathWorks, Inc.
高速化プログラミングについて下記のような知識を得る事をお勧めします。
高速化プログラミング (webサイト)
高速化プログラミング入門 (書籍)
MATLABの高速化についてもドキュメントは豊富にあります。
Kategorien
Mehr zu パフォーマンスとメモリ finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!