5

unixカスタム MATLAB 関数をオンザフライで作成し、コマンドを使用して他の MATLAB インスタンスで起動する MATLAB プログラムを作成しました。このプログラムを使用して、fMRI 神経画像解析を自動化しました (MATLAB に SPM8 を使用)。すべて正常に動作します。ただし、MATLAB では、関数名の長さが最大 ​​63 文字に制限されています ( namelengthmax)。各関数名に 2 つの異なるタイムスタンプをそれを作成した関数の名前と共に保存する必要があるため (マルチスレッド fMRI 分析に使用されるこれらの新しい関数を作成するいくつかの異なる関数があります)、63 文字は次のようなファイル名にはかなり制限されます。 :

atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15.m

この例atfでは、「分析スレッド関数」(同様のファイル名を持つ他のファイルから分離するため) を意味し、最初のタイムスタンプは実行を識別します (グローバル タイムスタンプ、この場合は 2012 年 7 月 5 日の 18:01:02)。この新しい「分析スレッド関数」を作成しspecify_1st_levelた関数 (この場合はspecify_1st_level.m(および異なる分析サブジェクト、または異なる分析) であり、同時に実行されます。

私の問題は、関数名の文字数制限が 63 文字であることです。

アンダースコア ( ) なしでタイムスタンプを記述_したり、それらを圧縮したり、関数名を短くしたり (例: specify_1st_level.m-> sp1st.m) したり、その場で作成した関数を別のサブフォルダーに分割したりできることを認識しています。その場で名前を付けます。グローバルタイムスタンプ付き。編集:または、関数名全体のハッシュを作成し、上記の人間が読める文字列の代わりにハッシュを関数名として使用することもできます。

ただし、「分析スレッド関数」の名前にさらにデータを追加する予定です (異なる時間の同一の分析を識別するために、この実行で使用される異なる分析パラメーター セットの 1 つまたは複数のハッシュ値)。可能であれば、私はそれを素晴らしくシンプルに保ちたいと思っています (人間が読める関数名は、その場で作成された「分析スレッド関数」のデバッグに役立ちます)。

それで、拡張する方法はあります namelengthmax か?Linux で MATLAB R2012a を実行しています。また、この問題を解決する他の方法を聞いてうれしいです。

4

2 に答える 2

4

名前の長さの制限を変更できないことは確かです。ただし、2 番目のタイムスタンプの日付を省略できる場合があります。完全なタイムスタンプを保存する代わりに、オフセットを使用します (実行が完了するまでに x 時間かかる場合は「HH:MM:SS」の形式で、実行が完了するまでに x 日かかる場合は「dd HH:MM:SS」の形式で、 ...)。

また、あなたは見ることができます

help datenum

タイムスタンプを短くするために。しかし、この関数は人間が読めるタイムスタンプにはなりません。

私は今、これはあまり賢明ではありませんが、非常に実用的な解決策が必要な問題のように思えます。

于 2012-07-05T16:21:16.637 に答える
2

私自身の質問への回答: もう少し考えた結果、必要なだけ多くの情報を MATLAB 関数名に埋め込み、それでも人間が読めるようにする方法を見つけました。まず、関数ファイル名の SHA1 ハッシュを計算します: is の SHA1 ハッシュ (ここでatf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15.mE545831A 0002C73B CA095F11 25FC5C51 35B82451、わかりやすくするためにスペースを入れています)。

次に、私の関数名は になり[ 'atf_', sha1hashString, '.m' ]ます。この例では になりますatf_E545831A0002C73BCA095F1125FC5C5135B82451.m。したがって、関数名の長さは 44 文字になりますが、まったく問題ありません。これにより 63 文字という制限は解決されますが、通常の bash コマンドを使用して関数を見つける方法も必要です。

そのため、その関数ファイルのコピーを作成し、元の関数名の末尾にハッシュを連結して、atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_E545831A0002C73BCA095F1125FC5C5135B82451.m. ls次に、またはfind(デバッグ目的で) を使用して bash で正しい関数を簡単に見つけることができます。ファイル名の末尾からハッシュを確認し、MATLAB から呼び出される関数 (例: atf_E545831A0002C73BCA095F1125FC5C5135B82451.m) で MATLAB デバッガーのブレークポイントを設定し、MATLAB デバッガーを使用します。問題なく。

これは私が考えることができる最も実用的な解決策であり、分析パラメーター セットのハッシュを関数名に追加することも可能にします。分析パラメーター セットの SHA1 ハッシュを計算するだけです (パラメーターの SHA1 ハッシュがset is A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D, 元の関数名と連結すると、それは になりますatf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D.m. 次に、解析パラメータ セットの SHA1 ハッシュで拡張された、この元の関数名の新しい SHA1 ハッシュを計算します: atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D.misの SHA1 ハッシュA81F0083 38868103 F1A0DB69 010279D5 5DB3751E. 次に、2 つを作成します同一の関数、1 つは MATLAB 用、もう 1 つはデバッグ用であり、それらには名前が付けられatf_A81F008338868103F1A0DB69010279D55DB3751E.matf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D_A81F008338868103F1A0DB69010279D55DB3751E.m. また、このように、同じ関数名に異なるパラメーター セットの複数の SHA1 ハッシュを含めることもできます。1 つは含まれるサブジェクトを定義し、もう 1 つはデータ処理パラメーターなどを定義し、それらの両方またはすべてをファイル名に連結してから、SHA1 ハッシュを計算し、上記のように 2 つの同一の関数を記述します。

于 2012-07-05T18:28:49.817 に答える