MATLABとC言語との違い
関数、命令 |
C言語 |
MATLAB |
swap関数 |
swap(a,b); |
tmp=a;a=b;b=tmp |
配列 |
0から始まる。角括弧、変数宣言が必要 x[j] |
配列は1から始まる。変数への引数を直すのは面倒なので1を足してやるとよい。角括弧ではなく丸括弧、変数宣言はしなくてもよい。 x(j+1) |
2次元配列 |
a[i][j] |
a(i+1,j+1) |
for文 |
for(j=0;j <= NUM;j++)
{ 文 |
for j=0:NUM 文 end |
for(j=0;j < NUM;j++)
{ } |
この場合NUMは含まないので1引く for j=0:NUM-1 文 end |
|
for(j=NUM;j >=0;j--) { } |
減少するループの場合には、このようにする。 for j=NUM:-1:0 end |
|
for (jp=0;jp < n;jp = jp + n_half)
{ } |
ステップ数が異なる場合には、for文のベクトルの中にステップ数n_halfを書く。また、最後は、nでは無く、(n-half)である点に注意。 for jp=0:n_half:(n-nhalf) end |
|
演算を含んだfor文 |
for(k = 1;k < n;k = k <<1)
{ 文 } |
ステップ数の個所に演算含んだFor文は、MATLABではできない。そこで一度while文に変換してインプリメントする。 k=1; while(k < n) 文 k = k * 2; end |
関数 |
double ft1(double u,double
t) { return (t + u); } |
MATLABでは、インライン文が使える。ただし、C言語との違いは、使う関数は、先に定義する必要がある。 ft1=inline('t+u'); |
シフト命令 |
jp = jp >>
1; |
MATLABではシフト命令は無いのでそれに相当するように2で割る。割った結果を切り捨てて整数にするためfloor関数を使う。 jp = floor(jp/2); |
AND/OR演算 |
jx=(jx << 1) | (jp &
1); |
2進数のAND/ORは、bitand,bitorを使う。 jx = bitor(jx *2,bitand(jp,1)); |
print文 |
printf(“\n相異なる実根です。”); |
printfの代わりにfprintf関数を使う。文は、シングルクォーテーションを使う。 fprintf(‘\n相異なる実根です。’); |
goto文 |
AA: 文 goto AA; |
MATLABには、goto文に相当する命令が存在しない。アルゴリズムを変更して対応する必要がある。(基本的には、絶対なくすことは可能!それができないプログラムは、作ってはだめ!) |
実計算量を計測するには、
MATLABで、実時間量を計測するには、flops関数を用いる。flops関数とは、浮動小数点演算の数カウントする関数のことで、加算と減算は、実数であれば1フロップ、複素数であれは2フロップでカウントされる。乗算と除算は、結果が実数であれば1フロップ、結果が複素数であれば6フロップでカウントされる。初等関数では、実数ならば1フロップ、複素数ならばそれ以上でカウントされる。
for i=1:1000;sum=sum+i/10.0;end
の計算が何回の浮動小数点演算をするのかカウントするスクリプトを示す。
flops(0); % フロップをクリア sum=0; for i=1:1000;sum=sum+i/10.0;end sum flops |
として、スクリプトファイルflotest.mに保存したとすると
》 flops(0); % フロップをクリア
sum =
50050
ans =
2000
と表示される。この場合、実数の足し算が1000回、割り算が1000回あったので計2000回の計算があったことを示している。