Matlabはベクトル演算専門なので,C言語みたいなfor文を書くと,とんでもなく遅くなることがある.以下がその例.
clear;
Resolution = 16; % [bit]
Amplitude = 200; % [mV]
DC = 0; % [mV]
Vref = 320; % [mV]
Fin = 11; % 入力周波数 = (Fin/FFT_point)*Fs
FFT_Point = 128;
Des_Ratio = 128;
G1 = 1;
G2 = 1;
FB1 = 1;
FB2 = 1;
Total_Point = FFT_Point*Des_Ratio;
Coeff1 = 2*pi*Fin/Total_Point;
tic
t = [0:1:Total_Point-1];
Vsin = Amplitude*sin(t*Coeff1);
toc
V1 = G1*Vsin;
tic
% Vsin2 = zeros(Total_Point,1);
for i=1:1:Total_Point
Vsin2(i,1) = Amplitude*sin(i*Coeff1);
end
toc
VsinとVsin2は同じ値を持つ配列なんだけど,Vsinはベクトル演算でfor文を使ってない.このときのtic-tocは0.3ms程度なのに対し,Vsin2の生成には0.2秒もかかってる.およそ1000倍!
これ,どうやらVsin2の配列要素数をfor文の進行と同時に動的変更してるのがまずいらしい.
そこで,上のVsin2=zeros・・・っていうところを有効にして,for文計算するまえにあらかじめVsin2の配列要素数を確保しておくと,時間は1ms程度になった.
気をつけよう.
clear;
Resolution = 16; % [bit]
Amplitude = 200; % [mV]
DC = 0; % [mV]
Vref = 320; % [mV]
Fin = 11; % 入力周波数 = (Fin/FFT_point)*Fs
FFT_Point = 128;
Des_Ratio = 128;
G1 = 1;
G2 = 1;
FB1 = 1;
FB2 = 1;
Total_Point = FFT_Point*Des_Ratio;
Coeff1 = 2*pi*Fin/Total_Point;
tic
t = [0:1:Total_Point-1];
Vsin = Amplitude*sin(t*Coeff1);
toc
V1 = G1*Vsin;
tic
% Vsin2 = zeros(Total_Point,1);
for i=1:1:Total_Point
Vsin2(i,1) = Amplitude*sin(i*Coeff1);
end
toc
VsinとVsin2は同じ値を持つ配列なんだけど,Vsinはベクトル演算でfor文を使ってない.このときのtic-tocは0.3ms程度なのに対し,Vsin2の生成には0.2秒もかかってる.およそ1000倍!
これ,どうやらVsin2の配列要素数をfor文の進行と同時に動的変更してるのがまずいらしい.
そこで,上のVsin2=zeros・・・っていうところを有効にして,for文計算するまえにあらかじめVsin2の配列要素数を確保しておくと,時間は1ms程度になった.
気をつけよう.










