【MATLAB】変数をスクリプトへ保存


変数をスクリプトに保存?

MATLAB で計算結果を保存するときは、MAT ファイル、Excel などのファイルへの保存が定番かと思いますが、変数の型によってはスクリプトに書き出すことができます。要は、実行するとその変数が作られるようなスクリプト。MATLAB を使って10年程になりますが、先日 初めて 役に立ちました・・他にも役に立つシーンはあるはず!ということで、ご紹介。

こんなケースで使っています・使ったよ、などあればコメント欄にてぜひ共有ください。

やり方1:GUI

ワークスペース上で保存したい変数を「右クリック」->

「名前を付けて保存」-> 「MATLAB スクリプト(*.m)」を選択すると・・

こんな感じ。保存できないクラスやオブジェクトの場合や、配列サイズが大きすぎる場合は、mat ファイルに保存され、それを読み込む m ファイルが出来上がります。

やり方2:コマンド

もちろん、コマンドでも同じことはできます。Var1 を保存するなら


matlab.io.saveVariablesToScript('mydata.m','Var1')

詳細はこちら:MATLAB スクリプトへのワークスペース変数の保存

ワークスペース設定画面

「設定」にも関連項目あります。

、、なにが嬉しいの?

ファイルからの読み込みをしたくないときに、簡単に変数を再現させられます。数個のデータであればで手書きでもいいんですが、多くなると大変。
例えば ThingSpeak の MATLAB Analysis で使いたい変数があるとか、MATLAB Answers にサンプルコード挙げる時とか、Cコード生成するときに変数を m コードに直書きしたいとか? そんなことしない?

今回使った例(に近いもの)を参考まで。
Qiita の MATLAB タグが付いた記事、月間投稿数を定期的にプロットを表示する仕組みを作ることにしました。

毎回 Qiita API を叩いて全投稿の投稿日データを取ることもできますが、記事が大量になってくるとあまり現実的ではないですし、API も使いすぎるとなんか申し訳ない。MATLAB タグならデータ量もまだ知れていますけども。

ということで、ThingSpeak の様なシステム上で現時点からの投稿総数は定期的に保存し続けるとして、これまでの月間投稿数のデータはスクリプトに書き込んでおくことにしました。

getBarChart.m

% Historical data: 2011/10/1 - 2019/10/31
counts = [1; 2; 0; 0; 0; 0; 0; 2; 0; 0; 0; 1; 1; 1; 3; 1; 1; 0; 0; 1; 0; 0; ...
     0; 0; 0; 1; 0; 0; 2; 4; 3; 1; 1; 3; 2; 0; 1; 4; 2; 2; 0; 0; 1; 2; ...
     5; 5; 2; 2; 4; 5; 7; 2; 1; 1; 1; 6; 2; 2; 2; 5; 6; 9; 2; 6; 5; 4; ...
     3; 3; 5; 7; 10; 2; 7; 50; 11; 4; 9; 4; 5; 4; 15; 13; 9; 13; 11; 7; ...
     13; 3; 8; 8; 2; 7; 6; 4; 32; 23; 24];
xmonths = datetime(2011,10,1) + calmonths(0:(length(counts)-1))';
bar(xmonths,counts,1)
grid on

冒頭の counts 部分がスクリプトに保存機能を使ってできたスクリプトからコピペした部分。ちなみに投稿総数はこんな感じで取得します。

getTotalCount.m

url = "https://qiita.com/api/v2/tags/matlab";
tmp = webread(url);

まとめ

変数のスクリプト保存を紹介しました。地味。
皆さんの「こんなところで役立った!」があればコメントくださいませ。

ちなみに R2019b を使用しています。

Appendix:月間投稿数を集計して棒グラフ描くコード

全投稿の投稿日データを取って、月間投稿数に集計してプロットするコード全文。

getMonthlyChart.m

accessToken = 'Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxx'; % ダミートークン
opts = weboptions('HeaderFields',{'Authorization',accessToken});
% opts = weboptions; % トークン使用しない場合

item_list = table;
index = 0;
while true
    index = index + 1;
    % 100件ずつ取得します。
    url = "https://qiita.com/api/v2/tags/matlab/items?page="+index+"&per_page=100";
    tmp = webread(url,opts);

    if isempty(tmp) % 終了条件
        break
    end

    created_at = datetime(vertcat(tmp.created_at),...
        'InputFormat', "uuuu-MM-dd'T'HH:mm:ss'+09:00");
    N = length(created_at);
    tmp = table(created_at, ones(N,1), ...
        'VariableNames',{'created_at','count'});
    item_list = [item_list; tmp]; % item_list に追加
end

% 月間データに集計
titem_list = table2timetable(item_list,'RowTimes','created_at');
monthlyitem = retime(titem_list,'monthly','count');

% 棒グラフ表示
x = monthlyitem.created_at;
y = monthlyitem.count;
bar(x,y,1);
grid on
title('MATLAB tag: 月間投稿数');