从CygWin中运行的(bash)shell脚本调用MATLAB函数时,我遇到了一个奇怪的问题。
这是有问题的命令:
"$MATLAB_PATH/matlab" -wait -nojvm -nosplash -automation -logfile "$MATLAB_LOGFILE" -r "myFunction $(echo ${FUNCTION_ARGS[@]}); quit;"
当bash命令行上的echoed
评估为类似以下内容时:
/cygdrive/c/Program Files (x86)/MATLAB/R2010a/bin/matlab -wait -nojvm \
-nosplash -automation -logfile MATLAB_output.txt -r myFunction \
/path/to/relevant/data/data1.txt /path/to/other/relevant/data/data2.txt \
<<several more such arguments>>; quit;
总的来说,命令的长度约为2000个字符,具体取决于调用脚本的路径。
问题是我的MATLAB函数只接收17个参数(~1017个字符),而我发送它超过30个参数。
其他观察到的行为:
echoed
命令行复制粘贴到常规 MATLAB会话(即不是自动化服务器)时,似乎没有问题,并且该函数执行得很好在所有~30个论点上。 -wait
选项),MATLAB函数将突然接收18个参数,最后一个参数是18 th <的一部分/ sup>我传入的字符串。1014
个字符。显然,在工具链的某个地方,命令可以拥有的最大长度有限制。我没有在MATLAB的文档,它的自动化服务器,bash或CygWin中找到任何相关内容 - 它们都有限制,但更多的是大约32K字符,比我传入的方式更多。
所以......我不知所措。我不确定如何诊断哪个工具导致了这个......任何想法?
修改
输出xargs --show-limits
:
Your environment variables take up 5556 bytes
POSIX upper limit on argument length (this system): 24396
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 18840
Size of command buffer we are actually using: 24396
expr $(getconf ARG_MAX) - $(env|wc -c) - $(env|wc -l) \* 4 - 2048
的输出:
24098
所以,正如我所说,即使是最小的也不会接近我的〜2000个字符。
答案 0 :(得分:0)
Matlab处理命令行可能存在限制。例如,为函数分配的缓冲区长度可以限制为1014个字符。
在脚本中,将函数调用保存在脚本中,并尝试在命令行上将脚本传递给Matlab。
http://www.mathworks.com/help/matlab/ref/matlabwindows.html说:
matlab -r“statement”启动MATLAB并执行指定的MATLAB语句。如果statement是MATLAB函数或脚本的名称,请不要指定文件扩展名。任何必需的文件必须位于MATLAB搜索路径或启动文件夹中。