コードを書く時のご自身のルールを教えてください

Jiro Doke on 14 Jun 2025 at 14:58
Latest activity Reply by 交感神経優位なあかべぇ on 18 Jun 2025 at 14:40

これからは生成AIでコードを1から書くという事が減ってくるのかと思いますが,皆さんがMATLABのコードを書く時に意識しているご自身のルールのようなものがあれば教えてください.
MATLAB言語は柔軟に書けますが,自然と個人個人のルールというものが出来上がってきているのでは,と思います.
私はParameter, Valueペアの引数がある関数はそれぞれのペアを新しい行に書く,というのをよくやります.
h = plot(x, y, "ro-", ...
"LineWidth", 2, ...
"MarkerSize", 10, ...
"MarkerFaceColor", "g");
Parameter=Valueでも同じです.
h = plot(x, y, "ro-", ...
LineWidth = 2, ...
MarkerSize = 10, ...
MarkerFaceColor = "g");
また,一時期は "=" を揃えることもやってました(今はやってませんが).
h = plot(x, y, "ro-", ...
LineWidth = 2, ...
MarkerSize = 10, ...
MarkerFaceColor = "g");
皆さんにはどのようなルールがありますか?
交感神経優位なあかべぇ
交感神経優位なあかべぇ on 18 Jun 2025 at 14:34
Mathworksの意向に反してる気がしますが、MATLABの列優先を意識したデータ構造にしてます。下記例だと、列にデータを追加していくほうが100倍以上高速になります。
% データを1行ずつ追加していく
tic;
data = zeros(0,1000);
for i = 1 : 10000
data(end + 1, :) = rand(1,1000);
end
toc;
% データを1列ずつ追加していく
tic;
data = zeros(1000,0);
for i = 1 : 10000
data(1000,end + 1) = rand(1000,1);
end
toc;
経過時間は 16.255466 秒です。
経過時間は 0.100127 秒です。
点群データも3×n, 画像データも3×m×nにしています。内積計算やら、他言語との連携、データ処理など何かと有利になることが多いです。ただ、MATLABの標準関数はn×3, m×n×3なので、そこは不便です。
交感神経優位なあかべぇ
交感神経優位なあかべぇ on 18 Jun 2025 at 14:40
あと、Simulinkでの使用や、コード生成をする機会が多いので、使用するMATLAB関数がコード生成に対応しているかどうかは結構気にして書いています。(もちろん使用用途によりますが)
Tak
Tak on 16 Jun 2025 at 8:51 (Edited on 16 Jun 2025 at 9:03)
プログラミング経験もなくはじめてMATALBを触る…といったメンバーに教える機会も多いので、極力 MathWorks さんのドキュメンテーションに寄せて書くようにしています。Name, Value ペアは私も同じくですね。
MATLABエディターのハイライト機能や置き換え、自動補完などが便利なこともあり、長くなっても変数や関数名は具体的に書くようになってしまいました。
  • 変数名や関数名: ロワーキャメルケース (fileNames, getFileNames など)
  • クラス名やプロパティ名: アッパーキャメルケース (MyClass, FileNames など)
  • コールバック関数: スネークケース (callback_function など)
文字列処理も昔は何でもかんでも [ ]strrep を使うことが多かったですが、最近は append (結合) や erase (削除) 、 replace (置換) など、一目でなにをしているか分かりやすくなることから意識して使うようになりました。
逆に、ユーザー側が意識しなくてよいローカル関数や呼び出し関数記述については、極端に記号化された変数や arguments による引数チェックなども遠慮なく使い、自分自身の可読性に極端に振りますね。
Jiro Doke
Jiro Doke on 16 Jun 2025 at 13:19
可読性を意識されているところがいいですね.私も変数名にロワーキャメルケースを使うことが多いです.
あと,初心者向けの可読性と @Tak さんのような熟練者に対する可読性が違うというところが興味深いです.確かに arguments などはプログラミング初心者にとっては謎のおまじないですが,とても便利な機能ですよね.
Angelo Yeo
Angelo Yeo on 16 Jun 2025 at 4:32
私だけのルールというと。。。for loopを回す時iteratorに意味があればできる限りに「i_(意味)」の形でiteratorを作るということです。 たとえば、複数のpngファイルに対してfor loopを回しますと
D = dir("*.png");
filenames = {D.name};
foldernames = {D.folder};
n_file = length(filenames)
for i_file = 1:n_file % <----- こちらのi_file
% disp(filenames{i_file})
end
の形にするのが普通です。
Jiro Doke
Jiro Doke on 16 Jun 2025 at 5:29
n_file もそうですかね.要素の数を表す変数は「n_(意味)」みたいな.
michio
michio on 16 Jun 2025 at 1:18
マイルール・・意外と思いつかない。無なくて七癖ということで、いろいろあるとは思うんですけど。
できるだけ string 型で統一する・・(完璧にはできていない)でしょうか。
h = plot(x, y, 'ro-', ...
'LineWidth', 2, ...
'MarkerSize', 10, ...
'MarkerFaceColor', 'g');
じゃなくて
h = plot(x, y, "ro-", ...
"LineWidth", 2, ...
"MarkerSize", 10, ...
"MarkerFaceColor", "g");
Jiro Doke
Jiro Doke on 16 Jun 2025 at 3:24
私もできる限りstring型で統一しようと努力してますが,まだたまに習慣でcharを使ってしまうことがあります.
string型の方がパフォーマンスが良いと以前聞いたことがあるのですが,シミュレーションしてみました.
nLoop = 1e8;
nSims = 100;
t1 = nan(nSims,1);
t2 = nan(nSims,1);
hFig = uifigure;
d = uiprogressdlg(hFig,"Title","Simulating...","Message","Wait");
for ii = 1:nSims
d.Value = ii/nSims;
tic
for id = 1:nLoop
x = "abc"; % Stringの定義
end
t1(ii) = toc;
tic
for id = 1:nLoop
y = 'abc'; % Charの定義
end
t2(ii) = toc;
end
close(d)
Time = [t1;t2];
TextType = [repmat("string",nSims,1); repmat("char",nSims,1)];
TextType = categorical(TextType);
tbl = table(TextType,Time,'VariableNames',["Text Type","Time (sec)"]);
hAx = uiaxes(hFig,"Units","normalized","Position",[.05 .05 .9 .9]);
swarmchart(hAx,tbl,"Text Type","Time (sec)")
hAx.YLim(1) = 0;
title(hAx,"x = 'abc' vs x = ""abc""")
michio
michio on 16 Jun 2025 at 3:32
なんと string 型定義の方が速いですね・・。
Kojiro Saito
Kojiro Saito on 16 Jun 2025 at 7:44
私も極力string使う派なのですが、File Exchangeの古いライブラリとか、charしか受け付けないものもあって苦い顔してシングルクォーテーションに書き換えています。
Iwasato Takuya
Iwasato Takuya on 15 Jun 2025 at 13:18
ルールというほどのものではないかと思いますが…
私の場合、計測後の解析処理を検討することが多いので、次のようになりがちかなと感じています。
clear;close all;clc
filename = '~'
Jiro Doke
Jiro Doke on 15 Jun 2025 at 13:44
解析処理の場合は,私もそれ良くやります.
clear all でなく clear なのがいいですね.