我有一个MATLAB程序,可以动态创建自定义MATLAB函数,并使用unix命令在其他MATLAB实例中启动它们.我使用这个程序来自动化fMRI神经成像分析(使用SPM8 for MATLAB),一切正常.但是,MATLAB强制函数名称长度最多为63个字符(namelengthmax).因为我需要在每个函数名中保存两个不同的时间戳以及创建它的函数的名称(我有几个不同的函数来创建用于多线程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),并且我也可以将我在即时创建的子文件夹中创建的函数分开在飞行中命名为例如.全球时间戳.编辑:或者我甚至可以创建整个函数名称的哈希值,并使用哈希作为函数名称而不是上面提供的人类可读字符串.
但是,我计划在"分析线程函数"的名称中添加更多数据(此运行中使用的不同分析参数集的一个或多个哈希值,以识别不同时间的相同分析).如果可能的话,我希望保持简洁(人类可读的函数名称有助于调试动态创建的"分析线程函数").
那么,有什么方法可以扩展 namelengthmax 吗?我正在Linux中运行MATLAB R2012a.我也很高兴听到任何其他方法来解决这个问题.
回答我自己的问题:经过更多思考,我找到了一种方法,可以将尽可能多的信息嵌入到 MATLAB 函数名称中,并且仍然保持人类可读。首先,我将计算函数文件名的 SHA1 哈希值:atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15.mis 的SHA1 哈希值E545831A 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然后我可以在 bash 中使用or轻松找到正确的函数find(出于调试目的),检查文件名末尾的哈希值,并在 MATLAB 调试器中在将从 MATLAB 调用的函数中设置断点(例如atf_E545831A0002C73BCA095F1125FC5C5135B82451.m)并使用 MATLAB 调试器没有什么问题。
这是我能想到的最实用的解决方案,它也可以将分析参数集的哈希值添加到函数名称中:我将只计算分析参数集的 SHA1 哈希值(假设参数的 SHA1 哈希值设置为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。然后我将创建两个相同的函数,一个用于 MATLAB,一个用于我的调试目的,它们将被命名为atf_A81F008338868103F1A0DB69010279D55DB3751E.m和atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D_A81F008338868103F1A0DB69010279D55DB3751E.m。甚至可以通过这种方式在同一函数名称中设置不同参数集的多个 SHA1 哈希值,例如定义要包含的主题的函数、其他定义数据处理参数等,然后将它们全部或全部连接到文件名,然后计算 SHA1 哈希并编写两个与上面相同的函数。