「Octave入門」の版間の差分

1,378 バイト除去 、 2016年5月14日 (土)
編集の要約なし
編集の要約なし
編集の要約なし
2行目: 2行目:
Octave(正確にはGNU Octave)は行列・ベクトルの数値演算を行なうことのできる,コマンドラインインタフェースを備えたフリーの汎用演算ソフトです.本家webサイトは http://www.octave.org/ です.
Octave(正確にはGNU Octave)は行列・ベクトルの数値演算を行なうことのできる,コマンドラインインタフェースを備えたフリーの汎用演算ソフトです.本家webサイトは http://www.octave.org/ です.


Octave自体に組み込まれている関数やコマンドは基本的なものに限られていますが,多くの関数やコマンドを世界中の人が開発し,公開するプロジェクトがあります( http://octave.sourceforge.net/ ).その成果はOctave-forgeというパッケージとして公開されています(関数一覧は http://octave.sourceforge.net/index/index.html ).研究室のマシンにインストールされているのもOctave-forgeパッケージです.
Octave自体に組み込まれている関数やコマンドは基本的なものに限られていますが,多くの関数やコマンドを世界中の人が開発し,公開するプロジェクトがあります( http://octave.sourceforge.net/ ).その成果はOctave-forgeというパッケージとして公開されています.研究室のマシンにインストールされているのもOctave-forgeパッケージです.


== 基本操作 ==
== 基本操作 ==
=== 起動と終了 ===
=== 起動と終了 ===


起動はWindowsPCならスタートメニューのGNU Octave 2.1.50 を選びます.MacOS XやlinuxなどPC-unix系のシステムなら,ターミナルを開いてoctaveとタイプすればいいです.起動するとターミナルが開き,コマンドを受け付ける状態になります.終了はexitとタイプします.
起動はWindowsPCならスタートメニューのGNU Octave 3.x を選びます.OS XやlinuxなどPC-unix系のシステムなら,ターミナルを開いてoctaveとタイプすればいいです.起動するとターミナルが開き,コマンドを受け付ける状態になります.終了はexitとタイプします.


=== ヘルプ ===
=== ヘルプ ===
204行目: 204行目:
線の種類や色を変えたいときは,変数の後に続けてダブルコーテーションかシングルコーテーションでくくったフォーマット文字列を書けばいいです.
線の種類や色を変えたいときは,変数の後に続けてダブルコーテーションかシングルコーテーションでくくったフォーマット文字列を書けばいいです.


  >> plot(X, Y, "b+")
  >> plot(X, Y, 'b+')


この例は,色をblueとし,線ではなくて+記号でプロットします.その他の色や線類はhelpで調べて下さい.
この例は,色をblueとし,線ではなくて+記号でプロットします.その他の色や線類はhelpで調べて下さい.
210行目: 210行目:
なお,plot関数の引き数としてx軸, y軸, 線種を繰り返し用いることで複数のグラフを重ね書きすることもできます.
なお,plot関数の引き数としてx軸, y軸, 線種を繰り返し用いることで複数のグラフを重ね書きすることもできます.


  >> plot(X1, Y1, "r-", X2, Y2, "g-")
  >> plot(X1, Y1, 'r-', X2, Y2, 'g-')




217行目: 217行目:
plot関数でグラフを書いた後,xlabel, ylabel, titile関数で軸ラベルとタイトルをつけることができます.
plot関数でグラフを書いた後,xlabel, ylabel, titile関数で軸ラベルとタイトルをつけることができます.


  >> xlabel("time (s)")
  >> xlabel('time (s)')
  >> ylabel("sin(x)")
  >> ylabel('sin(x)')
  >> title("This is a sample graph")
  >> title('This is a sample graph')


また,グリッド(格子)をつけるには,
また,グリッド(格子)をつけるには,
227行目: 227行目:


プロットの説明(凡例)が右上に自動的にでますが,これはlegend関数で変更できます.不要な場合は,
プロットの説明(凡例)が右上に自動的にでますが,これはlegend関数で変更できます.不要な場合は,
  >> legend("off")
  >> legend('off')
で消えます.
で消えます.


なお,環境によってはlegend関数がうまく機能しない場合があります.その場合は,plot関数でプロットする際に,色や線種を指定するのと同時に説明文をセミコロンで囲むことで指定できます.
なお,環境によってはlegend関数がうまく機能しない場合があります.その場合は,plot関数でプロットする際に,色や線種を指定するのと同時に説明文をセミコロンで囲むことで指定できます.


  >> plot(X, Y, "r-;sin;", X, Z, "g-;cos;")
  >> plot(X, Y, 'r-;sin;', X, Z, 'g-;cos;')




241行目: 241行目:
とすることで,x軸y軸それぞれの範囲を指定できます.なお,axis関数はグラフをプロットした後に実行しても効果がないので,後から実行した場合はもう一度プロットし直す必要があります.また,自動調整に戻す場合は,
とすることで,x軸y軸それぞれの範囲を指定できます.なお,axis関数はグラフをプロットした後に実行しても効果がないので,後から実行した場合はもう一度プロットし直す必要があります.また,自動調整に戻す場合は,


  >> axis("auto")
  >> axis('auto')
   
   
とします.
とします.
254行目: 254行目:
グラフをTeX文書などに取り込む場合は,EPSファイルとしていったん保存します.print関数を使うことでファイルに出力できます.
グラフをTeX文書などに取り込む場合は,EPSファイルとしていったん保存します.print関数を使うことでファイルに出力できます.


  >> print("test.eps","-deps2")
  >> print('test.eps','-deps2')


一つ目の引数はファイル名で,二つ目はファイルの形式を指定するオプションです.-dに引き続いて,eps2はEPSのレベル2と言う意味です.epsc2とすればカラーになります.
一つ目の引数はファイル名で,二つ目はファイルの形式を指定するオプションです.-dに引き続いて,eps2はEPSのレベル2と言う意味です.epsc2とすればカラーになります.
276行目: 276行目:
とすることで現在のpath設定が表示されます.(ゼミ開講現在,Windows環境ではなぜか表示されません.)これらに,自身のディレクトリを''追加''するには以下のようにします.
とすることで現在のpath設定が表示されます.(ゼミ開講現在,Windows環境ではなぜか表示されません.)これらに,自身のディレクトリを''追加''するには以下のようにします.


  >> path(path, "/cygdrive/h/Documents/m_files/")
  >> path(path, '/cygdrive/h/Documents/m_files/')


この例では,Documentsディレクトリの下のm_filesディレクトリにmファイルを入れておけば,カレントディレクトリがどこであっても実行できるようになります.なお,間違って
この例では,Documentsディレクトリの下のm_filesディレクトリにmファイルを入れておけば,カレントディレクトリがどこであっても実行できるようになります.なお,間違って
  >> path("/cygdrive/h/Documents/m_files/")
  >> path('/cygdrive/h/Documents/m_files/')
とすると,pathがm_filesだけになり,自作のコマンド以外は全く実行できなくなりますので,注意です.(一度Octaveを終了して再度起動すれば元に戻ります)
とすると,pathがm_filesだけになり,自作のコマンド以外は全く実行できなくなりますので,注意です.(一度Octaveを終了して再度起動すれば元に戻ります)


329行目: 329行目:
  >> a = [1 2 3];
  >> a = [1 2 3];
  >> B = [1 2 3; 4 5 6; 7 8 9];
  >> B = [1 2 3; 4 5 6; 7 8 9];
  >> save -ascii alldata.dat
  >> save -text alldata.dat


とすれば,ファイルalldata.datに,現在のすべての変数の内容がアスキー形式(テキスト形式)で書き出されます.メモ帳など適当なテキストエディタで内容を確認できるはずです.なお,バイナリ形式で保存する場合は-binaryというオプションをつけます.テキスト形式にくらべて精度が高く,ファイルサイズも小さくなります.
とすれば,ファイルalldata.datに,現在のすべての変数の内容がアスキー形式(テキスト形式)で書き出されます.メモ帳など適当なテキストエディタで内容を確認できるはずです.なお,バイナリ形式で保存する場合は-binaryというオプションをつけます.テキスト形式にくらべて精度が高く,ファイルサイズも小さくなります.
358行目: 358行目:
実験結果をOctaveで処理したりグラフ化する場合,実験用のプログラム(通常はC言語などで自作するでしょう)側はOctaveに渡したいデータをテキスト形式のファイルとして保存するのが簡単です.
実験結果をOctaveで処理したりグラフ化する場合,実験用のプログラム(通常はC言語などで自作するでしょう)側はOctaveに渡したいデータをテキスト形式のファイルとして保存するのが簡単です.


saveコマンドに- asciiオプションをつけて保存したファイルは,一般に複数の変数について,変数名,タイプ,行サイズ,列サイズ,数列が列挙されています.このフォーマットを再現するようにプログラムを自作すれば,loadコマンドで先と同様に読み込めます.しかし,通常はタブまたはスペース区切りの数列だけのテキストファイルで保存しておき,Octave側で必要に応じて各変数に切り分けることが多いです.
saveコマンドに-textオプションをつけて保存したファイルは,一般に複数の変数について,変数名,タイプ,行サイズ,列サイズ,数列が列挙されています.このフォーマットを再現するようにプログラムを自作すれば,loadコマンドで先と同様に読み込めます.しかし,通常はタブまたはスペース区切りの数列だけのテキストファイルで保存しておき,Octave側で必要に応じて各変数に切り分けることが多いです.


例えば,次のような内容のテキストファイルresult.txtがカレントディレクトリにあるとします.
例えば,次のような内容のテキストファイルresult.txtがカレントディレクトリにあるとします.
384行目: 384行目:
=== 他のアプリケーション向けのテキストデータ書き出し ===
=== 他のアプリケーション向けのテキストデータ書き出し ===


Octaveでのシミュレーションや解析の結果を他のアプリケーション(例えばExcelなどのスプレッドシートやIgorやNGraphといったグラフ化ソフトなど)に渡したい時はテキストファイルとして書き出します.ただし,save -ascii 変数名 変数名 ...で保存できるOctave固有のフォーマットのファイルをそのまま読み込めるとは限らないので,以下のような工夫が必要です.
Octaveでのシミュレーションや解析の結果を他のアプリケーション(例えばExcelなどのスプレッドシートやIgorやNGraphといったグラフ化ソフトなど)に渡したい時はテキストファイルとして書き出します.ただし,save -text 変数名 変数名 ...で保存できるOctave固有のフォーマットのファイルをそのまま読み込めるとは限らないので,以下のような工夫が必要です.


まず,書き出したい変数を結合して一つの変数にしておきます.このときサイズ(行数)が揃っていないとエラーになりますので,揃えるか,一緒にすることをあきらめて別のファイルにするか決めます.シミュレーション結果などは,時刻ベクトル,入力ベクトル,出力ベクトルなどが大抵同じ行数でしょうから,まとめて1つの行列にできるでしょう.
まず,書き出したい変数を結合して一つの変数にしておきます.このときサイズ(行数)が揃っていないとエラーになりますので,揃えるか,一緒にすることをあきらめて別のファイルにするか決めます.シミュレーション結果などは,時刻ベクトル,入力ベクトル,出力ベクトルなどが大抵同じ行数でしょうから,まとめて1つの行列にできるでしょう.
391行目: 391行目:


  >> outfile = [t u y];
  >> outfile = [t u y];
  >> save -ascii outfile.txt outfile
  >> save -text outfile.txt outfile


保存されたファイルの最初の5行は,日付や変数名,サイズなどの情報で先頭文字が#になっています.受け取る側のアプリケーションでその行を無視するように設定できれば,そのまま使用できますが,そうでない場合はテキストエディタで削除してから読み込ませる必要あります.
保存されたファイルの最初の5行は,日付や変数名,サイズなどの情報で先頭文字が#になっています.受け取る側のアプリケーションでその行を無視するように設定できれば,そのまま使用できますが,そうでない場合はテキストエディタで削除してから読み込ませる必要あります.


最初から先頭の不要な行をつけないで保存するには,saveコマンドを利用せず,C言語と同様にfopen()によるファイルのオープン,fprintf()による書式付き書き出し,fclose()によるファイルのクローズの手順を踏みます.
最初から先頭の不要な行をつけないで保存するには,-textではなく,-asciiオプションを使用します.
 
>> outfile = [t u y];
>> fid = fopen("outfile.txt", "w");
>> fprintf(fid, "%g %g %g\n", outfile');
>> fclose(fid);
 
このようにfprintf()の引数として行列やベクトルがとれて,いっぺんに複数行書きだしてくれるところがC言語より便利な点です(C言語ならfor()ループが必要でしょう).ただし,fprintf()の引数の行列にアポストロフィー(' )を付ける必要があります.すなわち,行列を転置して引数とする必要があります.また,書式指定内には%gが行列の列数と同じ数だけ必要です.
 
なお,Octave-forgeパッケージに限りますが,dlmwrite()という関数を用いると簡単に数列だけのファイルとして保存できます.
 
>> dlmwrite("outfile.txt", outfile, " ");
 
とすればいいです.3つ目の引数は区切りにする文字の指定で,ここではスペースにしています(省略するとカンマになります).


>> save -ascii outfile.txt outfile


== Octaveスクリプトのいろいろ ==
== Octaveスクリプトのいろいろ ==
419行目: 407行目:
画面への出力はC言語と同じくprintf命令を使います.
画面への出力はC言語と同じくprintf命令を使います.


  a = input("Please input a: ");
  a = input('Please input a: ');
  printf("a = %g\n",a);
  printf('a = %g\n',a);


=== 条件判定 ===
=== 条件判定 ===
426行目: 414行目:
条件判定にはC言語と同じくif命令が利用できます.ただし,C言語のように括弧で条件式は囲みません.また,中括弧({ })は使用せず,endifでif命令の範囲を指定します.さらに,C言語ではelseとifを分けて書きますが,Octaveではelseifと続けて書きます.
条件判定にはC言語と同じくif命令が利用できます.ただし,C言語のように括弧で条件式は囲みません.また,中括弧({ })は使用せず,endifでif命令の範囲を指定します.さらに,C言語ではelseとifを分けて書きますが,Octaveではelseifと続けて書きます.


  a = input("Please input a: ");
  a = input('Please input a: ');
  if a > 0
  if a > 0
  printf("a > 0\n");
  printf('a > 0\n');
  elseif a > -5
  elseif a > -5
  printf("-5 < a <= 0\n");
  printf('-5 < a <= 0\n');
  else
  else
  printf("a < = -5\n");
  printf('a < = -5\n');
  endif
  end


=== 繰り返し ===
=== 繰り返し ===
443行目: 431行目:
  while 条件
  while 条件
   命令群
   命令群
  endwhile
  end


  sum = 0;
  sum = 0;
  while  sum < 100
  while  sum < 100
   a = input("Please input a: ");
   a = input('Please input a: ');
   sum = sum + a;
   sum = sum + a;
   printf("sum = %g\n", sum);
   printf('sum = %g\n', sum);
  endwhile
  end




466行目: 454行目:
   if sum >100
   if sum >100
    break
    break
   endif
   end
  endfor
  end
  printf("On i = %d, sum = %g\n", i, sum);
  printf('On i = %d, sum = %g\n', i, sum);


初期値:増分:終値という書き方は,ベクトルの作成にも使えますので覚えておくと便利です.
初期値:増分:終値という書き方は,ベクトルの作成にも使えますので覚えておくと便利です.
482行目: 470行目:
  % 関数の説明
  % 関数の説明
   命令群
   命令群
  endfunction
  end


関数の終わりを示すためにendfunction命令が必要です.また,function命令直後のコメント文はhelpで表示されるので,簡単な説明を入れておくと良いでしょう.
関数の終わりを示すためにendfunction命令が必要です.また,function命令直後のコメント文はhelpで表示されるので,簡単な説明を入れておくと良いでしょう.


別ファイルで関数を定義する場合は,ファイル名を関数名に拡張子.mをつけます.この場合endfunctionはあっても無くても構いません(MATLABでは書かないので書かない方がいいかも).さらに,関数名は既存の関数とかぶらないように,オリジナルなものになるよう注意が必要です.
別ファイルで関数を定義する場合は,ファイル名を関数名に拡張子.mをつけます.関数名は既存の関数とかぶらないように,オリジナルなものになるよう注意が必要です.


なお,C言語の関数と同様に,関数内で変数はローカル変数となるので,変数名がかぶっても内容は別物となることに注意が必要です.
なお,C言語の関数と同様に,関数内で変数はローカル変数となるので,変数名がかぶっても内容は別物となることに注意が必要です.
499行目: 487行目:
  c  = a - b;
  c  = a - b;
  err = c' * c;
  err = c' * c;
  endfunction
  end