
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('日本', '耕地') のようなアクセスが可能です。

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 さんです。
タイトル画像モデル:海老澤一恵