FC2ブログ

初心者によるMATLABメモ

3次元形状やってんのになぜかMATLABを使わされることになった人のメモ。

 

検索エンジンから来た方は読みたい記事が表示されていない可能性があります。
その場合、左メニューのフォームでブログ内を検索すると見たい記事を見れると思います。
もしくは、カテゴリー名をクリックしていただくと各カテゴリーの記事のリストが見れます。

[基本] 作業ログの保存などに使う関数diaryの拡張

簡単な作業ログの保存などに使う関数diaryを拡張したdiary2()です。(mファイルのダウンロードはこちら)
基本的にはdiary()と機能、使い方は変わりません。

違う点は、diaryだと追加書き込みに自動的になってしまいますが、diary2だと新規書き込みを行うことができます。
また、開始時と停止時にタイムスタンプを自動的に書き込みます。
あとは現在のdiaryファイルの名前の表示、diaryのon/offの表示の程度の機能が追加されています。

使い方は基本的にはdiary()と同じです。
diary2 … diary('on')と同じ
diary new … 以後の出力をdiaryファイルに書き込みます。(ファイルが存在しても新規書き込み)
diary on … 以後の出力をdiaryファイルに書き込みます。(ファイルが存在すれば追加書き込み)
diary off … 書き込みを中止します。

diary stat … diaryモードのON/OFFを表示します。
diary fname … 現在指定されているdiaryファイル名を表示します。

diary('ファイル名') … diaryファイル名を指定して書き込みを開始します。
diary('ファイル名','on') … diaryファイル名を指定し、追加書き込みを行うことができます。
diary('ファイル名','new') … diaryファイル名を指定し、新規書き込みを行うことができます。

※diary2('file')は、diary2('file','on')と同じです。

on/off/newあたりは普通のdiaryと使い方が同じなので、ここでは省略するとして、一応statとfnameだけ例を載せておきます。
一連の流れとして使用するとこんな感じです。
>> diary2('diary.txt','new')
>> diary2 fname
現在のdiaryのファイル名 ... [ diary.txt ]
>> diary2 stat
現在のdiaryの状態 ... [ on ]
>> diary2 off
>> diary2 stat
現在のdiaryの状態 ... [ off ]

最後にソースを載せておきます。
また、diary2()のヘルプ付きのmファイルのダウンロードはこちらから行えます。
function diary2(varargin) 

%% 引数のチェックと処理
error(nargchk(0,2,nargin));

opt = 0;
diary_path = get(0, 'DiaryFile');
mode = {'on','new','off','stat','fname'};

for ii = 1:nargin 
    in = varargin{ii};

    if ischar(in) 
        hit = find(strcmpi(lower(in), mode));
        if isempty(hit) 
            if ~strcmpi(diary_path,in) 
                diary2 off;
                diary_path = in;
            end;
        else 
            opt = hit(1);
        end;
    else 
        error('引数は文字列である必要があります');
    end;
end;

if opt==0 
    if strcmpi(get(0,'Diary'),'on') 
        opt=3;
    else 
        opt=1;
    end;
end;
%% 


%% 実際の処理
switch opt 
    % 書き込み開始 
    case {1,2} 

        % diaryファイルへの書き込み開始メッセージ書き込み 
        if strcmpi(get(0,'Diary'),'off') 
            if opt==1 
                perm = 'a+';
            else 
                perm = 'w+';
            end;
            fid = fopen(diary_path,perm);
            fprintf(fid, '%s¥n', '%%% =================  diary 書き込み開始 ==================== ');
            fprintf(fid, '%s%s¥n¥n', '+ 現在時間 : ', datestr(now,31));
            fclose(fid);
        end;

        % diary on
        diary(diary_path);
    % 書き込み停止 
    case 3
        % diaryファイルへの書き込み終了メッセージ書き込み 
        if strcmpi(get(0,'Diary'),'on') 
            diary off;

            fid = fopen(diary_path,'r+');

            body = {};
            frewind(fid);
            while 1 
                tline = fgetl(fid);
                if ~ischar(tline), break, end;
                body{length(body)+1} = tline;
            end;

            body{end} = [];

            frewind(fid);
            for ii=1:length(body)
                fprintf(fid, '%s¥n', body{ii});
            end;
            fprintf(fid, '%s%s¥n', '+ 現在時間 : ', datestr(now,31));
            fprintf(fid, '%s¥n', '%% ========== / diary 書き込み停止 ==========');

            fclose(fid);
        end;
    % ステータス 
    case 4 
        disp(sprintf('現在のdiaryの状態 ... [ %s ]', get(0,'Diary')));
    % ファイル名表示 
    case 5 
        disp(sprintf('現在のdiaryのファイル名 ... [ %s ]', get(0,'DiaryFile')));
    otherwise
        help diary2;
end


参考:MATLAB Function Reference - diary
ダウンロード:このエントリのmファイル 左クリックでお願いします。 (リファラを送信しない場合は,アクセス拒否になってしまいます)
スポンサーサイト



テーマ:MATLAB - ジャンル:コンピュータ

このエントリに付けられたタグ|MATLABdiary()作業ログ

[小技] diary()を引数なしで使ったときのファイル名に拡張子をつける

先ほどstartup.mのエントリを書いていて思ったんですが,一部抜き出しでこちらに書いておきます。
diary()を使うと,コマンドウインドウの出力のログを作成してくれますが,この関数は引数なしで使ったときの作られるファイル名がなぜか拡張子なしの「diary」なんですよね。
ログはテキストファイルで出力されるので,拡張子が付いて欲しい…

その場合には,下記のコマンドをstartup.mに追加しておくと,拡張子.txtが付くようになります。
%% diaryコマンドが作る標準のファイル名を変更
set(0, 'DiaryFile', 'diary.txt');


参考:MATLAB Function Reference - diary
参考:初心者によるMATLABメモ| 起動時にデフォルトカラーなどを設定する (起動時にスクリプトを実行)
このエントリに付けられたタグ|MATLABdiary()デフォルトstartup()