5

unix我编写了一个 MATLAB 程序,它可以动态创建自定义 MATLAB 函数并使用命令在其他 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。我也很高兴听到任何其他解决此问题的方法。

4

2 回答 2

4

我很确定您不能更改名称长度的限制。但也许您可以省略第二个时间戳中的日期。而不是保存完整的时间戳,只需使用偏移量(如果运行需要 x 小时才能完成,格式为“HH:MM:SS”;如果运行需要 x 天完成,则格式为“dd HH:MM:SS”; ...)。

你也可以看看

help datenum

为了缩短您的时间戳。但是这个函数不会产生人类可读的时间戳。

我现在这不是很聪明,但对我来说这听起来像是一个需要非常务实的解决方案的问题。

于 2012-07-05T16:21:16.637 回答
2

回答我自己的问题:经过深思熟虑后,我找到了一种方法,可以将尽可能多的信息嵌入到 MATLAB 函数名称中,并且仍然保持对人类的可读性。首先,我将计算我的函数文件名的 SHA1 哈希值: 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然后我可以使用or (出于调试目的)在 bash 中轻松找到正确的函数find,检查文件名末尾的哈希并在 MATLAB 调试器中设置断点,该函数将从 MATLAB 调用(例如。atf_E545831A0002C73BCA095F1125FC5C5135B82451.m)并使用 MATLAB 调试器没有问题。

这是我能想到的最实用的解决方案,它也可以将分析参数集的散列添加到函数名称中:我将只计算分析参数集的 SHA1 散列(假设参数的 SHA1 散列set is A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D, 并与原始函数名连接起来 it'll be atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D.m. 然后我将计算这个原始函数名的新 SHA1 哈希值, 并使用分析参数集的 SHA1 哈希值扩展: is 的 SHA1 哈希值atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D.m.A81F0083 38868103 F1A0DB69 010279D5 5DB3751E然后我将创建两个相同的函数,一个用于 MATLAB,一个用于我的调试目的,它们将被命名atf_A81F008338868103F1A0DB69010279D55DB3751E.matf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D_A81F008338868103F1A0DB69010279D55DB3751E.m. 甚至可以通过这种方式在同一个函数名中设置多个不同参数的 SHA1 哈希,例如。一个定义要包含的主题,另一个定义数据处理参数等,然后将它们两者或全部连接到文件名,然后计算 SHA1 哈希并编写两个与上述相同的函数。

于 2012-07-05T18:28:49.817 回答