どのToolboxがいるの？って言われたときのMATLAB術

## 目次
[はじめに](#はじめに)
 [関数のリンク先](#関数のリンク先)
 [コードの中身について](#コードの中身について)
 &emsp;[概要](#概要)
 &emsp;[関数の定義と説明](#関数の定義と説明)
 &emsp;[関数のドキュメント](#関数のドキュメント)
 &emsp;[入力処理](#入力処理)
 &emsp;[ツールボックスの特定](#ツールボックスの特定)
 &emsp;[まとめ](#まとめ)
 [注意点](#注意点)
[おわりに](#おわりに)
# はじめに
こんにちは、HerniaBabyです。
皆さん、こんなことないですか？
せっかく作ったMATLABコードを他の人に渡すとき、先方にこんなセリフを吐かれてしまうなんてこと…

**「必要なToolboxしか入れたくないんだけど？どれがいるん？」**

今回はそんなワガママベイビーな方々の要望にかなえる関数を作成しました。
# 関数のリンク先

File Exchangeにも掲載中です。

[![View findRequiredToolboxes on File Exchange](https://www.mathworks.com/matlabcentral/images/matlab-file-exchange.svg)](https://jp.mathworks.com/matlabcentral/fileexchange/166666-findrequiredtoolboxes)

GitHub Link ：[findRequiredToolboxes](https://github.com/HerniaBaby/findRequiredToolboxes.git)

# コードの中身について
ChatGPTに説明させます笑

## 概要

このMATLABコードは、指定されたMATLABスクリプトや関数ファイルに必要なツールボックスを特定するための関数<samp>findRequiredToolboxes</samp>を定義しています。


この関数は、<samp>.m</samp>、<samp>.mlx</samp>、および<samp>.slx</samp>ファイルタイプに対応しています。以下にコードの詳細な説明を示します。

<a name="H_03315127"></a>
## 関数の定義と説明
```matlab
function requiredToolboxes = findRequiredToolboxes(scriptPath)
```

-  <samp>findRequiredToolboxes</samp> は関数名です。 
-  <samp>scriptPath</samp> は入力引数で、MATLABスクリプトや関数のファイルパスを表します。 
-  <samp>requiredToolboxes</samp> は出力で、必要なツールボックスのリストが入ります。 
<a name="H_5E54E77F"></a>
## 関数のドキュメント
```matlab
    % findRequiredToolboxes - 指定されたMATLABスクリプトや関数に必要なツールボックスを特定します。
    % 
    % Syntax: requiredToolboxes = findRequiredToolboxes(scriptPath)
    % 
    % Inputs:
    %    scriptPath - 必要なツールボックスを特定したいMATLABスクリプトや関数のファイルパス
    % 
    % Outputs:
    %    requiredToolboxes - 必要なツールボックスのリスト
```

-  この部分では、関数の簡単な説明、構文、入力、および出力について説明しています。 

## 入力処理
```matlab
switch nargin
    case 0
        [file,path] = uigetfile( ...
            {'*.m;*.mlx;*.slx', ...
            'MATLAB Files (*.m,*.mlx,*.slx)'; ...
            '*.*',  'All Files (*.*)'},'Select a file');
        if isequal(file,0)
            disp('User selected Cancel');
            msg = 'You need to select a file.';
            error(msg)
        else
            path = fullfile(path,file);
        end
    case 1
        path = scriptPath;
end
```

-  ここでは、入力引数<samp>scriptPath</samp>の処理を行っています。 
-  入力引数が提供されていない場合 (<samp>nargin == 0</samp>)、ファイル選択ダイアログ (<samp>uigetfile</samp>) がユーザーに表示されます。 
    -  ユーザーがファイル選択をキャンセルした場合、エラーメッセージが表示されます。 
    -  ファイルが選択された場合、そのフルパスが構築されます。 
-  入力引数が提供されている場合 (<samp>nargin == 1</samp>)、<samp>path</samp>は<samp>scriptPath</samp>に設定されます。 

<a name="H_BE1B1282"></a>
## ツールボックスの特定
```matlab
[~,~,ext] = fileparts(path);
if ext == ".slx"
    sList = dependencies.toolboxDependencyAnalysis(path);
    reqiredToolboxes = string(sList)';
else
    [~, pList] = matlab.codetools.requiredFilesAndProducts(path);
    Tbox = string({pList.Name}');
    Certain = cell2mat({pList.Certain}');
    reqiredToolboxes = Tbox(Certain);
end
```

-  次に、指定されたファイルの拡張子を<samp>fileparts</samp>を使って取得します。 
-  **ファイルがSimulinkモデル（****<samp>.slx</samp>****）の場合：** 
    - <samp>dependencies.toolboxDependencyAnalysis(path)</samp>  を使って必要なツールボックスを特定します。 
    - 結果を文字列配列に変換し、転置します。 
-  **ファイルがMATLABスクリプトや関数（****<samp>.m</samp>** **または** **<samp>.mlx</samp>****）の場合：** 
    - <samp>matlab.codetools.requiredFilesAndProducts(path)</samp>  を使って必要なファイルと製品を特定します。 
    - 製品名を文字列配列 <samp>Tbox</samp> に抽出します。 
    - <samp>Certain</samp>  フラグが真のツールボックスのみを最終リスト <samp>requiredToolboxes</samp> に含めます。 
<a name="H_F93C45EA"></a>
## まとめ
-  <samp>findRequiredToolboxes</samp> 関数は、MATLABスクリプト、関数、またはSimulinkモデルに必要なツールボックスを特定するのに役立ちます。 
-  ファイルパスを直接入力するか、GUIダイアログを使用して選択する柔軟性があります。 
-  異なるファイルタイプ（<samp>.m</samp>、<samp>.mlx</samp>、<samp>.slx</samp>）に適切に対応し、必要なツールボックスを特定します。 


<a name="H_5C3EAB7B"></a>
# 注意点

試行段階で気づいたんですが、スクリプトの中に関数を入れるとSimulinkが追加されます。


SampleScriptの中身と結果

```matlab
clc, clear;
disp('This is Sample Code')
txt = findRequiredToolboxes(fullfile(pwd,"SampleScript.m"));
fprintf('This code needs %s \n',txt)
```

出力
```TextOutput
This is Sample Code
This code needs MATLAB 
This code needs Simulink 
```

# おわりに
ChatGPTすげえ…笑