【问题标题】:Extending the maximum length of MATLAB function names扩展 MATLAB 函数名称的最大长度
【发布时间】:2012-07-05 15:49:51
【问题描述】:

我编写了一个 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 将此设置为硬编码。您可以查看namelengthmax,因为这是设置最大值。我怀疑它是否可以改变。

标签: function matlab


【解决方案1】:

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

你也可以看看

help datenum

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

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

【讨论】:

  • 偏移量是指两个时间戳之间的差异
  • 省略日期可以节省一些字符,就像我已经提到的将日期压缩成人类不可读的形式一样。但是这些并不能解决有限的namelengthmax 的基本问题,因此不允许我将参数集的散列合并到函数名称中的计划。看看我自己的回答。
【解决方案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。然后我可以使用lsfind(用于调试目的)在 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哈希值:SHA1 hash atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D.mA81F0083 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 哈希并写入两个功能同上。

【讨论】:

  • 理论上仍然有可能发生哈希冲突。所以可以肯定的是,您可以在写出函数之前添加检查是否已经存在具有相同名称/哈希的文件/函数,并向用户发出警告或稍后重试写入文件,因此使用不同的哈希。顺便说一句:最终你会遇到操作系统filename limit 来获取你的调试文件:p 但无论如何:不错的解决方案;)
  • 检查哈希冲突对于稳定性来说是一个好主意,即使哈希冲突极为罕见。 ext4/ext3/ext2 等的 255 个字符的最大文件名长度对我来说已经足够了,至少现在是这样。对于更长的文件名,一种选择是将文件系统更改为 Reiser4,它的最大文件名长度为 3976 字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2016-10-09
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 2015-11-24
  • 2017-05-25
相关资源
最近更新 更多