MATLABの罠40連発:経験者ならうなずきまくるあるある集

MATLABの罠あるある表(解説付き 40連発)

MATLABを使ったことがある人が大体うなずくリストを作ってみた。 きっとMATLABユーザー間の絆を深めること間違いなしだ。

  1. charstringが別物 → MATLABは長らく文字列をchar配列で扱ってきたが、2016年にstring型を追加。しかし後方互換性のため両方共存し、混在すると関数によって扱いが変わる。 🗨 「元カノ(char)と別れられない新カノ(string)」

  2. OOPが中途半端classdefでオブジェクト指向が可能だが、プロパティやメソッドのアクセス修飾子が制限され、抽象クラスやインターフェース実装も他言語に比べて不便。 🗨 「演劇部の本番がずっと練習モード」

  3. 関数引数で関数を呼べたり呼べなかったり → 名前解決ルールが複雑で、barが関数か変数かで挙動が変わる。関数ハンドルに明示しないと動かない場合あり。 🗨 「それ、function handleにしてから出直して」

  4. 改行文字列が面倒\nfprintf系では動くが、文字列リテラル内では直接使えない場合が多く、newline関数やchar(10)が必要。 🗨 「改行ぐらい素直にしてくれよ!」

  5. インデックスは必ず1始まり → 言語仕様として0始まりは不可。CやPython経験者が混乱しやすい。 🗨 「ゼロは存在しない世界線」

  6. スカラーも配列 → MATLABは全データを多次元配列として保持するため、1[1]も内部的には同じ。処理の中で次元が予期せず変化することがある。 🗨 「お前も行列だ!」

  7. 構造体・テーブル・マップの別物感 → 似たようなキーと値のデータ構造が複数存在し、それぞれ関数や操作が異なる。 🗨 「親戚の集まりで全員同じ顔」

  8. 1関数1ファイル縛り(旧仕様) → 昔はトップレベル関数は1つのMファイルに1つしか書けなかった。補助関数は同ファイル末尾に置くしかなかった。 🗨 「Mファイルタワー、崩落注意」

  9. 関数呼び出しで括弧省略可能 → 旧式の文法として、引数なしの関数は括弧を省略できるが、現代のコードと混在すると可読性が下がる。 🗨 「江戸時代からの直輸入」

  10. パス優先順位地獄 → MATLABは関数探索順がパス順依存で、同名関数が複数あると意図しないものが呼ばれる「シャドウイング」が発生。 🗨 「お前誰だよ(関数名同じ別人)」

  11. clear allでブレークポイント消滅 → ワークスペース変数を消すだけでなく、関数キャッシュやブレークポイントも消すため、デバッグ途中に実行すると悲劇。 🗨 「ctrl+zじゃ戻らないんだよ!」

  12. 演算子オーバーロード命名の謎plusメソッドで+演算子、mtimes*演算子など、特殊な名前にマッピングされていて覚えづらい。 🗨 「秘密の暗号かよ」

  13. 論理配列の挙動が独特 → 論理配列でインデックス指定すると要素が一次元化されることがあり、元の配列形状が保持されない。 🗨 「お前、誰の許可で形変えた?」

  14. 暗黙拡張ルールの世代差 → R2016b以前はブロードキャスト計算がなく、bsxfun必須。以降は暗黙拡張あり。古いコードとの混在で混乱。 🗨 「昔は手動だったんだぞ!」

  15. スクリプトのスコープ汚染 → スクリプトはベースワークスペースを直接操作するため、変数が意図せず上書きされる。 🗨 「台所でペンキ塗るな!」

  16. 変数名の大文字小文字区別とファイル名挙動 → 変数名は区別するが、ファイル名はOS依存で区別される/されない。クロスプラットフォームで不具合の原因。 🗨 「Windowsでは動くんですけど…」

  17. 浮動小数点比較の罠 → IEEE754の仕様により0.1+0.2==0.3はfalse。epsを使った比較が必要。 🗨 「0.3とは何か(哲学)」

  18. ループが伝統的に遅い → インタプリタ型処理のため、forループがベクトル化に比べ極端に遅い。 🗨 「for禁止令、発布」

  19. グローバル変数の扱いが不便 → 使用前に関数内外でglobal宣言が必要で、依存関係の追跡が難しい。 🗨 「世界は広い、変数は危険」

  20. GUI APIが二重構造 → 旧Handle GraphicsとApp Designerが別APIで、互換性が低く混在が面倒。 🗨 「親父の工具と最新3Dプリンタが同じ棚に」

  21. 自動型変換が地味に危険 → 計算時にlogicalが自動でdoubleになったり、型が暗黙変換されて意図しない結果に。 🗨 「勝手に大人にならないで」

  22. 複素数が当たり前に混ざる → 三角関数や行列演算で実数→複素数に変化することが自然に起きる。 🗨 「お前、心の中にi飼ってただろ」

  23. 配列サイズ変更が遅い → 動的にサイズを変えるたびにメモリ再確保が発生。大規模計算では致命的に遅くなる。 🗨 「引っ越しのたびに家を建て替える」

  24. try-catchが妙に長い → 他言語に比べて構文が冗長で、例外処理の記述量が多い。 🗨 「Javaかよ」

  25. NaNとInfの布教活動 → 計算エラーでも例外を出さずNaNInfを返すため、不具合を見逃しやすい。 🗨 「もう少し驚いてくれていいのに」

  26. 型名の長さが地味に長いcategorical, datetimeなど、長文型名でコーディング効率が下がる。 🗨 「略称? ないよ」

  27. ファイルI/Oの文法が古臭い → C言語風のfopen, fscanfが主流。高水準I/Oもあるが一貫性に欠ける。 🗨 「C語録がまだ現役」

  28. 正規表現が別世界regexpの戻り値仕様やオプション記法が独特で、他言語経験者が混乱。 🗨 「MATLAB語の方言」

  29. figureの挙動がOS依存 → MacとWindowsでGUI要素やレンダリングが異なり、見た目や動作が揃わない。 🗨 「異世界転生UI」

  30. ワークスペースがGUI前提文化 → デフォルトで変数や関数の確認はGUI(Workspace, Editor)を使う文化があり、CLI派には不便。 🗨 「ターミナルで生きたいのに部屋に連れ戻される」

  31. pathがユーザー依存の汚染状態 → 共同プロジェクトで共有すると、各人のpath設定により「俺のPCでは動く」現象が多発。 🗨 「同じ地図を見てるはずなのに別の場所に到着」

  32. toolbox間の関数名衝突 → 複数のToolboxに同名関数が存在し、どちらが呼ばれるかはパス順依存。 🗨 「双子の兄弟を間違えて呼んだ」

  33. 行列の次元拡張が暗黙的に発生 → 加算や連結で意図しない方向に次元が増えることがある。 🗨 「君いつの間に背が伸びた?」

  34. バージョン間で挙動が微妙に変わる → 同じ関数名でもR2014aとR2023bで結果や警告が異なることがある。 🗨 「同じ人だけど性格変わった?」

  35. eval依存コードの黒魔術化 → 可変変数名生成などでevalを使うと保守不能になる。 🗨 「闇の儀式を始めよう」

  36. 変数名が数字で始められない → ファイル名や外部仕様と合わせにくい。 🗨 「3D_plot? ダメです」

  37. 配列の末尾要素削除がやたら面倒 → Pythonのpop()のようなシンプル操作がない。 🗨 「最後の一口が食べられない」

  38. ファイル読み込みUIが古臭いuigetfileなどのUIが90年代感。 🗨 「タイムスリップしたダイアログ」

  39. 関数引数のデフォルト値設定が不自然 → Pythonのようにarg=defaultと書けず、narginで手動処理。 🗨 「まだ昭和の方式でやってます」

  40. スクリプト冒頭のclc; clear; close all;文化 → ほぼ儀式化しており、全部消さないと不安になる。 🗨 「お祓いしてから作業開始」