見出し画像

MATLAB で日本語変数名を使う


まえがき


さて、確定申告の季節ですね。

やる気はなかなか出ないですが、まあ私は控除する元がないので実際は苦労することはあまりなく、低見の見物です。(・_・、)


それはともかく、MATLAB の変数名として使用可能なのは、基本、英数字とアンダースコアのみ(最初の文字は英字)です。

matlab.lang.makeValidName 関数は、有効な識別子に変換を行います。

>> S = {'Item_#','Price/Unit','1st order','Contact先'};
N = matlab.lang.makeValidName(S)
N = matlab.lang.makeValidName(S,'ReplacementStyle','hex')
N = matlab.lang.makeValidName(S,'ReplacementStyle','delete')
N = matlab.lang.makeValidName(S,'Prefix','m_')

N =

  1×4 の cell 配列

    {'Item__'}    {'Price_Unit'}    {'x1stOrder'}    {'Contact_'}


N =

  1×4 の cell 配列

    {'Item_0x23'}    {'Price0x2FUnit'}    {'x1stOrder'}    {'Contact0x5148'}


N =

  1×4 の cell 配列

    {'Item_'}    {'PriceUnit'}    {'x1stOrder'}    {'Contact'}


N =

  1×4 の cell 配列

    {'Item__'}    {'Price_Unit'}    {'m_1stOrder'}    {'Contact_'}

>> 



ただし、通常の変数名そのものというわけではありませんが、識別子として日本語を使う方法はあります。

今回は小ネタとして、MATLAB で日本語変数名?を使うやり方をご紹介します。


dictionary

dictionary は各キーと値を対応付けるデータ構造体です。キーと値は任意のデータ型にすることができ、それらを使って変数のようにアクセスができます。

% 共通設定
varStrings = ["公的年金", "私的年金", "給与", "生命保険控除", "公的年金等控除", "基礎控除", "所得控除", "控除", "課税所得", "申告税額"];
data = zeros(size(varStrings));
% dictionary
a = dictionary(varStrings, data);  % R2022b ~

% containers.Map
% a = containers.Map(varStrings, data);


a("公的年金") = 123450;
a("私的年金") = 100000;
>> a

a =

  10 個のエントリをもつ dictionary (string ⟼ double):

    "公的年金"123450
    "私的年金"100000
    "給与"0
    "生命保険控除"0
    "公的年金等控除"0
    "基礎控除"0
    "所得控除"0
    "控除"0
    "課税所得"0
    "申告税額"0


エントリの追加も簡単にできます。

a("所得合計") = a("公的年金") + a("給与") + a("私的年金") - a("控除");
>> a

a =

  11 個のエントリをもつ dictionary (string ⟼ double):

    "公的年金"123450
    "私的年金"100000
    "給与"0
    "生命保険控除"0
    "公的年金等控除"0
    "基礎控除"0
    "所得控除"0
    "控除"0
    "課税所得"0
    "申告税額"0
    "所得合計"223450

>> a("所得合計") 

ans =

      223450


dictionary
が使えるのは R2022b 以降です。それ以前は containers.Map を使います。

dictionary  はキー値として containers.Map よりも多くのデータ型をサポートしておりパフォーマンスも高いため、containers.Map よりも推奨されています。


table 配列


table の各変数名も、スペースや非 ASCII 文字を含めどんな Unicode 文字でも使用することができます。

table 内の変数にアクセスするには、構造体のようにドット ( . ) を使います。

% table
a = array2table(data, 'VariableNames', varStrings);

a.("公的年金") = 123450;
a.("私的年金") = 100000;
a.("所得合計") = a.("公的年金") + a.("給与") + a.("私的年金");
>> a

a =

  1×11 table

     公的年金      私的年金    給与    生命保険控除    公的年金等控除    基礎控除    所得控除    控除    課税所得    申告税額     所得合計  
    __________    _______    ____    __________    ____________    _______    _______    ____    _______    _______    __________

    1.2345e+05     1e+05      0          0              0             0          0        0         0          0       2.2345e+05


>> a.("所得合計") 

ans =

      223450


エクセルから table に読み込む


エクセルを table に読み込む場合も、'preserve' オプションを付ければ日本語等をそのまま変数として読み込むことができます。

RowNames も設定すれば、T('日本', '耕地') のようなアクセスが可能です。

https://www.stat.go.jp/data/sekai/zuhyou/04.xlsx
inputFilename = "https://www.stat.go.jp/data/sekai/zuhyou/04.xlsx";
T = readtable(inputFilename,'Range', 'A3:D10','VariableNamingRule','preserve');
>> T

T =

  5×4 table

        国(地域)        陸地↵面積        耕地       永年↵作物地
    _________________    __________    __________    __________

    {'世界'         }    1.3015e+07    1.3967e+06    1.832e+05 
    {0×0 char       }           NaN           NaN          NaN 
    {'アジア'        }           NaN           NaN          NaN 
    {'日本'         }         36450          4086          263 
    {'アラブ首長国連邦'}          7102            50           41 

>> T(isnan(T.('耕地')), :) = []

T =

  3×4 table

        国(地域)        陸地↵面積        耕地       永年↵作物地
    _________________    __________    __________    __________

    {'世界'         }    1.3015e+07    1.3967e+06    1.832e+05 
    {'日本'         }         36450          4086          263 
    {'アラブ首長国連邦'}          7102            50           41 

>> T.('耕地')

ans =

     1396673
        4086
          50

>> T.Properties.RowNames = T.('国(地域)')  % RowNames を設定

T =

  3×4 table

                         国(地域)        陸地↵面積        耕地       永年↵作物地
                     _________________    __________    __________    __________

    世界             {'世界'         }     1.3015e+07    1.3967e+06    1.832e+05 
    日本             {'日本'         }          36450          4086          263 
    アラブ首長国連邦    {'アラブ首長国連邦'}          7102            50           41 

>> T('日本', '耕地')

ans =

  table

            耕地
            ____

    日本    4086

>> T{'日本', '耕地'}

ans =

        4086

少しややこしいかもしれませんが、ドット T.(expression) は配列の抽出、小括弧 T(rows,vars) は指定した行と変数のみをもつ table、中括弧 T{rows,vars} は指定した行と変数から配列を抽出します。


あとがき


私は古い買い切り ATOK(ATOK16)を使っているのですが、最近の MATLAB は文字コードの扱いが変わったようで、古いATOK を使うと落ちてしまいます

まあ元々ソースコードに日本語は使わないようにしてるのでそれほど問題はないのですが、クラッシュ・レポートを日本語で書こうとしても落ちるのはちょっと困りものです。


でもやはり、日本語変数名が使えると見通しはよいですね。

特に税金関係の計算するときとかは、日本語でないと訳が分からなくなります。

日本語でも訳分からないですが・・。

そうそう、官公庁関連もいちいち変なアプリ作るより、MATLAB スクリプトで出してほしいものです。(u_u) 


e-Tax 試してみたら、入れ直す度に生命保険料控除額が増えていくんですが・・?(;¬_¬) 


ちなみに、私の記事のコード中の日本語コメントを書いてるのはほとんど AI さんです。


タイトル画像モデル:海老澤一恵


いいなと思ったら応援しよう!