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程度になった.
気をつけよう.
ときは,imfilter,fspecialを使うとよい.たとえば,
また,Matlabには標準で各種フィルタが存在し,これがfspecialで呼び出せる.上記フィルタは
のようなフィルタならば,
1 2 1 0 0 0 -1 -2 -1
filter = [1 2 1;0 0 0;-1 -2 -1];とすればよい.ただし,ここでimage_dataは画像データとする.また,最後のreplicateとは,フィルタ演算時の境界条件で,画像エリア外の画素値はそれに最も近い画素値の値を使って処理する,というもの(と思う).
imfilter(image_data,filter,'replicate');
また,Matlabには標準で各種フィルタが存在し,これがfspecialで呼び出せる.上記フィルタは
filter = fspecial('sobel')と同じで,これをつかうと
imfilter(image_data,fspecial('sobel'),'replicate');となる.このほかにも
fspecial('laplacian');等がある.
fspecial('log');
files = dir('C:/')とする.このとき,存在したファイル数はsize(files)で取得できる.さらに,各ファイル名は
for i=1:1:size(files)で取得できる.
files(i).name
end
さらにつっこんで,正規表現にマッチしたファイルのみをリストしたいときは,
files = dir('C:/*.bmp')とすればよし.
Aという変数がTRUEだったら,という処理をするには,
A = 'TRUE';では駄目.こうじゃなくて,
if(A == 'TRUE')
if(strcmp(A,'TRUE'))とする.
















あなたのクリック待ってます