1.5 MATLABプログラムからのレポート自動生成機能


# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)


# 概要


MATLABで記述したプログラムから実行結果のレポートを生成(パブリッシュ)することができます。コードを共有する際に便利です。
レポートには実行プログラムやコメント、数式、実行結果の出力やfigureなどを含めることができます。




より直感的にレポートタイプのプログラムを記述する場合は[ライブスクリプト](https://www.mathworks.com/help/matlab/matlab_prog/what-is-a-live-script-or-function.html)がおすすめです。




(この投稿もライブスクリプトを使って記述しています)




対応ファイル：[I1_05_publish_butter.m](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I1_05_publish_butter.m)


# パブリッシュする対象を確認


パブリッシュする対象のMATLABプログラムを確認します。


```matlab:code
type I1_05_publish_butter.m
```
```text:output
%% バタワースフィルタの設計とフィルタリング
% 本デモは、雑音を加えた2トーン正弦波に対して、バタワースローパスフィルタを
% かける手順と、グラフの可視化の手順を示します。一般的なデジタルフィルタの
% 伝達関数は以下の表現で表わされます。
% 
% $$ H(z) = \frac{\sum^{N}_{k = 0}b_kZ^{-k}}{1 + \sum^{N}_{k = 1}a_kZ^{-k}} $$  
%% 初期化
clear all, close all, clc

%% フィルタリング対象の信号生成
Fs = 1000;
t = 0:1/Fs:1;                   % 時間ベクトルの定義
sig1 = sin(2*pi*15*t + pi/3);   % 正弦波信号1の生成
sig2 = sin(2*pi*42*t + pi/5);   % 正弦波信号2の生成
noise = randn(size(t));         % 雑音信号の生成
sig = sig1 + sig2 + noise;      % フィルタリング対象信号

%% フィルタ設計と特性の可視化
% フィルタの次数を7次、ナイキスト周波数で正規化されたカットオフ
% 周波数を0.1としたフィルタを設計します。Fs = 1000[Hz]の場合、
% カットオフ周波数は、1000/2 * 0.1 = 50[Hz]となります。
[b,a] = butter(7,0.1); % バタワースフィルタ設計
fvtool(b, a) % フィルタ特性の可視化

%% フィルタリング
out = filter(b,a,sig); % フィルタリング
% 入力信号と出力信号の時間軸波形可視化
subplot(2,1,1), plot(t,sig), grid
title('時間軸波形（フィルタリング前）')
subplot(2,1,2), plot(t,out), grid
title('時間軸波形（フィルタリング後）')

%% スペクトル推定
% ローパスフィルタにより、50[Hz]以下の成分が除去されている様子が
% 確認できます。
figure, periodogram(sig,[],[],Fs)    % 入力信号のスペクトル
title('パワースペクトル密度推定（フィルタリング前）')
figure,periodogram(out,[],[],Fs)    % 出力信号のスペクトル
title('パワースペクトル密度推定（フィルタリング後）')

% Copyright 2014 The MathWorks, Inc.
```
# パブリッシュを実行


MATLABコードを実行し、HTML形式のレポートを生成します。




ワード形式(.doc)、LaTeX形式(.tex)、パワーポイント形式(.ppt)、XML形式(.xml)、PDF形式(.pdf)でも出力することができます。


```matlab:code
publish("I1_05_publish_butter.m");
```
# 生成したHTMLのレポートを確認


MATLAB内蔵のブラウザで生成されたHTMLレポートを確認します。


```matlab:code
web(fullfile('html','I1_05_publish_butter.html'));
```


![image_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/f91bf642-e726-e15f-962d-15ac5f936b52.png)


# MATLABエディターによるパブリッシュ


MATLABエディター上からパブリッシュを実行することもできます。


```matlab:code
edit I1_05_publish_butter.m
```



![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/b6f747f2-7ed6-6ec7-a2c7-33f767ee66c4.png)


# パブリッシュされたHTMLからコードを取り出し


生成したHTMLコードからコードを取り出すことも可能です。


```matlab:code
code = grabcode(fullfile('html','I1_05_publish_butter.html'))
```
```text:output
code = 
    '%% バタワースフィルタの設計とフィルタリング
     % 本デモは、雑音を加えた2トーン正弦波に対して、バタワースローパスフィルタを
     % かける手順と、グラフの可視化の手順を示します。一般的なデジタルフィルタの
     % 伝達関数は以下の表現で表わされます。
     % 
     % $$ H(z) = \frac{\sum^{N}_{k = 0}b_kZ^{-k}}{1 + \sum^{N}_{k = 1}a_kZ^{-k}} $$  
     %% 初期化
     clear all, close all, clc
     
     %% フィルタリング対象の信号生成
     Fs = 1000;
     t = 0:1/Fs:1;                   % 時間ベクトルの定義
     sig1 = sin(2*pi*15*t + pi/3);   % 正弦波信号1の生成
     sig2 = sin(2*pi*42*t + pi/5);   % 正弦波信号2の生成
     noise = randn(size(t));         % 雑音信号の生成
     sig = sig1 + sig2 + noise;      % フィルタリング対象信号
     
     %% フィルタ設計と特性の可視化
     % フィルタの次数を7次、ナイキスト周波数で正規化されたカットオフ
     % 周波数を0.1としたフィルタを設計します。Fs = 1000[Hz]の場合、
     % カットオフ周波数は、1000/2 * 0.1 = 50[Hz]となります。
     [b,a] = butter(7,0.1); % バタワースフィルタ設計
     fvtool(b, a) % フィルタ特性の可視化
     
     %% フィルタリング
     out = filter(b,a,sig); % フィルタリング
     % 入力信号と出力信号の時間軸波形可視化
     subplot(2,1,1), plot(t,sig), grid
     title('時間軸波形（フィルタリング前）')
     subplot(2,1,2), plot(t,out), grid
     title('時間軸波形（フィルタリング後）')
     
     %% スペクトル推定
     % ローパスフィルタにより、50[Hz]以下の成分が除去されている様子が
     % 確認できます。
     figure, periodogram(sig,[],[],Fs)    % 入力信号のスペクトル
     title('パワースペクトル密度推定（フィルタリング前）')
     figure,periodogram(out,[],[],Fs)    % 出力信号のスペクトル
     title('パワースペクトル密度推定（フィルタリング後）')
     
     
     % Copyright 2014 The MathWorks, Inc.
     '
```
# まとめ


MATLABプログラムの自動レポート生成(パブリッシュ)について紹介しました。




コードや実行結果の共有に大変便利な機能です。


# 参考

   -  [MATLAB コードのパブリッシュと共有](https://jp.mathworks.com/help/matlab/matlab_prog/publishing-matlab-code.html) 
   -  [ライブ スクリプトとライブ関数](https://jp.mathworks.com/help/matlab/live-scripts-and-functions.html) 

# 謝辞


本記事は @eigs さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。


# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)