我有一个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
- > {{1}我也可以将我在飞行中创建的函数划分为不同的子文件夹,这些子文件夹也是在动态创建的,例如。全球时间戳。 编辑:或者我甚至可以创建整个函数名称的哈希值,并使用哈希值作为函数名称,而不是上面提到的人类可读字符串。
但是,我计划在“分析线程函数”的名称中添加更多数据(此运行中使用的不同分析参数集的一个或多个哈希值,以识别不同时间的相同分析)。如果可能的话,我希望保持简洁(人类可读的函数名称有助于调试动态创建的“分析线程函数”)。
那么,有没有办法扩展 sp1st.m
?我正在Linux中运行MATLAB R2012a。我也很高兴听到任何其他方法来解决这个问题。
答案 0 :(得分:4)
我很确定你不能改变namelength的限制。 但也许你可以在第二个时间戳中省略日期。只需使用偏移量(格式为“HH:MM:SS”,如果运行需要x小时才能完成;格式为'dd HH:MM:SS',如果运行需要x天才能完成;而不是保存完整的时间戳。 ...)。
你也可以看看
help datenum
为了缩短时间戳。但是这个函数不会产生人类可读的时间戳。
我现在这不是很聪明,但对我来说这听起来像需要一个非常实用的解决方案。
答案 1 :(得分:2)
回答我自己的问题:在进一步思考之后,我找到了一种方法,可以将尽可能多的信息嵌入到MATLAB函数名称中,并且仍然可以让它对人类可读。首先,我将计算我的函数文件名的SHA1哈希值:atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15.m
的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
或find
轻松地在bash中找到正确的函数(用于调试目的),检查文件名末尾的散列,并在将要调用的函数中在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.m
的SHA1哈希是A81F0083 38868103 F1A0DB69 010279D5 5DB3751E
。然后我将创建两个相同的函数,一个用于MATLAB,一个用于我的调试目的,它们将被命名为atf_A81F008338868103F1A0DB69010279D55DB3751E.m
和{{1甚至可以通过这种方式在同一个函数名中设置几个不同参数集的SHA1哈希,例如,一个定义要包含的主题,另一个定义数据处理参数等,然后连接它们的全部或全部到文件名,然后计算SHA1哈希并写上两个相同的函数。