为什么我需要在MATLAB中运行一个文件几次,然后它才会停止抛出错误?

为什么我需要在MATLAB中运行一个文件几次,然后它才会停止抛出错误?,matlab,Matlab,我一直在试着调试这个奇怪的bug,我在matlab中运行了一个脚本,它说它找不到一些我在文件夹中明确定义的函数,而且显然也导入到了运行的脚本中。但是,在运行脚本几次之后,它突然接受了脚本,它知道我的函数的位置并运行。我觉得这很奇怪,因为导入是确定性函数,所以不应该发生这种情况,所以我不知道为什么多次运行它会产生不同 要复制我的bug,您可以在我的项目中找到我的代码。转到/cd文件夹: research/HBF\u mat\u lib/HBF1\u多变量回归/om\u仿真/h\u add\u c

我一直在试着调试这个奇怪的bug,我在matlab中运行了一个脚本,它说它找不到一些我在文件夹中明确定义的函数,而且显然也导入到了运行的脚本中。但是,在运行脚本几次之后,它突然接受了脚本,它知道我的函数的位置并运行。我觉得这很奇怪,因为导入是确定性函数,所以不应该发生这种情况,所以我不知道为什么多次运行它会产生不同


要复制我的bug,您可以在我的项目中找到我的代码。转到/cd文件夹:

research/HBF\u mat\u lib/HBF1\u多变量回归/om\u仿真/h\u add\u cv

运行:

test\u debug\u脚本

在MATLAB中

它显示一个错误:

Undefined function 'learn_HBF1_SGD' for input
arguments of type 'HBF1_parameters'.

Error in get_best_trained_hbf1_model (line 37)
        [ mdl_params, errors_train, errors_test ] =
        train_func( X_train, y_train, mdl_params,
        iterations,visualize, X_test,y_test,
        eta_c,eta_t, sgd_errors);

Error in test_debug_script (line 11)
    get_best_trained_hbf1_model(slurm_job_id,
    task_id)

Error in run (line 96)
evalin('caller', [script ';']);
但是如果你试着运行它足够多的次数,它就会正常运行



我试图清除这个错误的事情是清除我的matlab环境,恢复我的路径到正常状态,在这一点上我不知道我能做什么,因为我在执行东西之前也打印出了路径,文件夹似乎在我的路径变量中。在这一点上,我不知道我能做什么,为什么在运行了几次之后,它总是会失败,但它不会…

我敢说,这是因为在通过
load\u paths.m
将函数放在Matlab路径上之前,您正在
simulation\u config.m
中创建对
learn\u HBF1\u SGD
的引用,这取决于函数句柄的内容。给定当前结构,我将切换到显式声明
train\u func\u name
,然后在加载路径后使用
str2func
创建句柄


文件的后续运行是有效的,因为执行直到调用之后才停止。由于
addpath
“将指定文件夹添加到当前MATLAB®会话的搜索路径顶部”,该函数在后续运行时位于Matlab路径上。

我敢说,这是因为在通过
加载路径.m
将函数置于Matlab路径之前,您正在
仿真配置.m
中创建对
学习\u HBF1\u SGD
的引用,这取决于函数句柄的内容。给定当前结构,我将切换到显式声明
train\u func\u name
,然后在加载路径后使用
str2func
创建句柄


文件的后续运行是有效的,因为执行直到调用之后才停止。由于
addpath
“将指定的文件夹添加到当前MATLAB®会话的搜索路径顶部”,因此该函数在MATLAB路径上进行后续运行。

@TroyHaskin ur a saviour(我认为它现在可以工作了)。我可以至少投票表决你的评论作为回答吗?尽管如此,它仍然让我困惑,即使我只是运行了几次脚本,为什么它仍然有效。这对我来说仍然很神秘。@TroyHaskin我现在看到了错误,但为什么matlab没有在代码中指向该点,比如“该函数不存在,所以我无法获得指向它的句柄/指针”。我把我的评论升级为一个答案,因为它起作用了。至于函数handle检查文件是否存在,这与其说是有害的,不如说是一个特性。我的意思是,这个函数将来可能会存在,那么为什么不允许一个语法正确的引用,它只会在被调用时出错呢?事实上,每当你看到一个“未定义函数”错误,你首先想到的应该是“它在路径上吗?”@TroyHaskin完全同意,我应该问这个问题。这就是为什么我在允许运行之前打印了路径。它说这是在我的道路上,所以我不知道为什么这是一个问题。事实上,如果后来我的函数所在的文件夹在我的路径中:/@TroyHaskin ur a saviour(我认为它现在起作用了),我仍然不知道你的建议是如何解决的。我可以至少投票表决你的评论作为回答吗?尽管如此,它仍然让我困惑,即使我只是运行了几次脚本,为什么它仍然有效。这对我来说仍然很神秘。@TroyHaskin我现在看到了错误,但为什么matlab没有在代码中指向该点,比如“该函数不存在,所以我无法获得指向它的句柄/指针”。我把我的评论升级为一个答案,因为它起作用了。至于函数handle检查文件是否存在,这与其说是有害的,不如说是一个特性。我的意思是,这个函数将来可能会存在,那么为什么不允许一个语法正确的引用,它只会在被调用时出错呢?事实上,每当你看到一个“未定义函数”错误,你首先想到的应该是“它在路径上吗?”@TroyHaskin完全同意,我应该问这个问题。这就是为什么我在允许运行之前打印了路径。它说这是在我的道路上,所以我不知道为什么这是一个问题。事实上,如果后来我的函数所在的文件夹在我的路径中,我仍然不知道你的建议是如何解决的:/但是我有RestoredPath,所以每次都重置了我的路径,但最终它仍然有效,这就是为什么这个bug真的很神秘。我希望你的建议能解决这个问题。还没有问题。“不过,我想让羚牛看看。”查理·帕克:这很奇怪,我忘了调查一下。显然,Matlab的最新版本将
restoredefaultpath.m
更改为。我不确定是否将路径保存在任何位置,但这可能是问题的根源。我建议使用
rmpath
进行更多控制。但我有RestoredPath,所以每次都重置路径,但最终仍然有效,这就是为什么这个bug非常神秘的原因。我希望你的建议能解决这个问题。还没有问题。“不过,我想让羚牛看看。”查理·帕克:这很奇怪,我忘了调查一下。显然,Matlab的最新版本将
restoredefaultpath.m
更改为。我不是苏尔