めっくろぐ

mechlog - メモ帳

MATLAB 効率化のための関数化

r-dimension.xsrv.jp


他のプログラミング言語と同様,MATLABでもスクリプトを可能な限り関数化することによって,効率よくシミュレーションを行えます.

関数化することによるメリットとしては,

  • 可読性が高まる
  • 再利用しやすくなる
  • 処理速度の高速化に貢献する

といったことが挙げられます.


MATLABのプログ​ラミングにおいてどの​ように関数をコールす​れば高速化ができます​か?

jp.mathworks.com


MATLABで関数を作る方法は,3つ考えられるので,整理して紹介します.

1.関数毎に mファイルを作る

最も汎用性が高く,一般的な方法だと思われます.
しかし,一目でプログラムの全体像を把握することが難しく,
関数毎にファイルが増えてしまうため管理も面倒です.

jp.mathworks.com


2.スクリプト全てを関数化する

function [] = test_script()
% function1, function2 を含むメインの処理の記述
clear; close all;
A = function1(1.0, 2.0)
B = function2(1.5, 2.5)
end

function [a] = function1(b, c)
% 自作の関数 その1
a = b + c;
end

function [d] = function2(e, f)
% 自作の関数 その2
d = e * f;
end

上記の様に記述し,"test_script.m"という名前で保存すれば,
スクリプト内の全部分が関数となる1つのmファイルが出来上がります.
こうすることで,処理の高速化ができ,
mファイルも1つに集約でき管理しやすくなります.

しかし,メイン部分まで関数にすることで,ワークスペースには変数が残らないようになります.
そのため,変数の状況を確認しながらスクリプトを修正していく,という書き方はできません.


3.スクリプトに関数を含める

% function1, function2 を含むメインの処理の記述
clear; close all;
A = function1(1.0, 2.0)
B = function2(1.5, 2.5)

function [a] = function1(b, c)
% 自作の関数 その1
a = b + c;
end

function [d] = function2(e, f)
% 自作の関数 その2
d = e * f;
end

R2016bから導入された機能です.

自作の関数を,スクリプト内で見渡すことができるうえ,
メイン部分の変数についてはワークスペースに保存されるため,データの様子を見ながらスクリプトを書き進めることができます.
新しい環境が使える方には,大変便利なのでおすすめです.
古い環境で実行しなければならないときでも,メイン部分もfunctionになるように数行書き足すだけ,手法2.と同じように扱えるので,支障ありません.


jp.mathworks.com


最新 使える!MATLAB 第2版 (KS理工学専門書)

最新 使える!MATLAB 第2版 (KS理工学専門書)

WindowsのAnaconda上にpython-controlを追加する方法

① 下記の方法でslycotを追加

algorithm.joho.info

自分の環境では,slycot-0.2.0-cp36-cp36m-win_amd64.whl をダウンロードし,

pip install slycot-0.2.0-cp36-cp36m-win_amd64.whl

を実行.

② 下記の方法でpython-controlを追加

Control :: Anaconda Cloud

pip install -i https://pypi.anaconda.org/pypi/simple control 


科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

MATLABで自分用の設定を保存する

はじめに

jp.mathworks.com
MATLABを利用する際,startup.mという名前のファイルを作り,
初期作業フォルダー上に置いておけば,
MATLAB起動時に自動的にstartup.mが読み込まれ,そこに書かれた設定が適用されます.


私は,パスの追加,figureの設定など,
いつも使う設定をまとめて startup.m に記述し,利用しています.
作成にあたっては,以下のページを主に参考にし,アレンジしました↓
ichiro-maruta.blogspot.jp
初心者によるMATLABメモ|起動時にデフォルトカラーなどを設定する (起動時にスクリプトを実行)

MATLABコード

%% 自作ライブラリの追加
% (自作関数などを,起動フォルダ下のmy_funcフォルダ内に置く)
addpath(genpath('myfunc'));

%% 色に関する設定
% プロットの色を指定
% (plot関数などで色を指定しない場合,順番に以下の色が使われる)
co = ...
    [255,   0,   0;      % 赤
    0,   0, 255;     % 青
    0, 128,   0;        % 緑
    222, 125,   0;      % 茶
    204,   8, 204;      % 紫
    255,  0, 255;        % マゼンタ
    64,  64,  64];      % 灰色
set(0,'defaultAxesColorOrder',co/255);

% Figureウインドウの色(白に設定)
set(0, 'defaultFigureColor',[1 1 1]);

% Figureをコピーしたときのプロットボックスの色(透明に設定)
% (PowerPointなどにFigureをコピーした際に,プロットボックスが透ける設定)
set(0, 'defaultAxesColor','none');

%% フォントの設定
% グラフ軸のフォントの設定
set(0,'defaultAxesFontSize',11);
set(0,'defaultAxesFontName','times new roman');
set(0,'defaultAxesXcolor','k');
set(0,'defaultAxesYcolor','k');
set(0,'defaultAxesZcolor','k');

% テキストのフォントの設定
set(0,'defaultTextFontSize',11);
set(0,'defaultTextFontName','times new roman');
set(0,'defaultTextColor','k');

% プロットの線幅
set(0,'defaultLineLineWidth',1);

% 軸の線幅
set(0,'defaultAxesLineWidth', 1);

% 凡例のフォント設定
set(0,'defaultLegendFontSize',11);
set(0,'defaultLegendFontName','times new roman');

%% Figureのスタイルの設定
% 常に grid on
set(0,'DefaultAxesXGrid','on');
set(0,'DefaultAxesYGrid','on');
set(0,'DefaultAxesZGrid','on');

% 常に box on
set(0,'DefaultAxesBox','on');

% グリッドラインの透明度( 1 は不透明,0 は完全に透明)
set(0,'DefaultAxesGridAlpha',1);

% グリッドラインのラインスタイル
set(0,'DefaultAxesGridLineStyle','--');

% Figureの保存時に,ウィンドウでの表示サイズのまま保存する
set(0,'DefaultFigurePaperPositionMode','auto');

% ウィンドウのサイズ変更を有効化
set(0,'DefaultFigureResize','on');

% startup.m が動いているか確認するための表示
slCharacterEncoding('Shift-JIS')
currentCharacterEncoding = slCharacterEncoding()

clear;

下記のGitHubリポジトリにも載せています.
github.com


上のコードでは,
figure作成時に,枠を表示しグリッドライン等をはっきりとした黒色で表示するように設定しています.
(デフォルトでは,灰色で表示されてしまい,私の用途には合いません)

以下が,デフォルトの状態のfigureと,
startup.mを使ったあとのfigureの比較です.



その他

グラフの設定に関しては,用途や趣向によって設定が様々あると思います.

set(0,'Default <プロパティ名> <値名>','<値>');

と記述することで,figureの外観等を一括で制御できます.
プロパティ名と値名は,Mathworks社のヘルプで見つけられます.
グラフ等を描くのに必要な値は,このあたりでしょう↓

https://jp.mathworks.com/help/matlab/ref/figure-properties.htmljp.mathworks.com
https://jp.mathworks.com/help/matlab/ref/axes-properties.htmljp.mathworks.com


また,デフォルトの設定に戻したいときは,
startup.mファイルを消した状態でMATLABを再起動するか,

reset(0)

をコマンドウィンドウに入力すればOKです.

おまけ

色々試して,一番しっくり来たエディタの背景色として,
薄いベージュを使うことにしています

MATLAB背景色

エディタにダークテーマがあればいいのに...