matlab中一个由于文件检索无法和函数并行而引发的问题
问题简述: 使用一个m函数来写一个.m文件(使用fopen fprintf fclose等), 而后首次调用该.m文件中的函数(直接使用或者使用@取出函数句柄), 则无法检测到该文件为一个matlab的m函数文件, 进而导致出错.
适用版本: MATLAB R2014b (8.4.0.150421) with Java: 1.7.0_11-b21 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
问题重现: 我懒, 直接贴代码了……
function [ flag ] = fncGenAndRunTest( )
%开始写函数
flag = 0 ;
fid = fopen ( 'subFnc.m' , 'w' ) ;
fprintf ( fid , '%s\n' , 'function [res]=subFnc(input)' , 'res=input;' , 'end');
fclose ( fid ) ;
%函数写完,尝试调用
try
fncPnt = @subFnc ;
flag=fncPnt(1);
display('√');
catch
warning('×');
%首次尝试失败,再次尝试
try
userpath('H:\Programming\matlab基地\示例\拾壹月问题汇总');
fncPnt = @subFnc ;
flag=fncPnt(1);
display('√');
catch
warning('×××');
%刷新路径(该路径为我存放和执行此函数的路径)后,发现仍然失败
end
end
%有趣的是,当此函数调用结束并且我的那个工作路径下仍存在subFnc.m文件时,第二次调用此函数会得到正确输出.
发现背景: 上个月我在写模拟退火+龙格库塔法对一组常微分方程组的系数做拟合的算法, 其中涉及到需要多次改变系数的值, 生成不同的方程来进行数值计算. 最初我的做法是动态生成了一堆.m文件, 事实证明这是行不通的…… 然后就发现了这个特性 (喵喵喵???)
推测原因: 见本博文标题……
解决方案: 所以最后我没有动态生成.m文件然后调用, 而是将这些函数写成字串的形式, 通过句柄从字串生成匿名函数, 最后用eval来执行这些函数, 代码比较丑(毕竟eval + try catch)不贴了.
*更新:此问题可能是由于Matlab底层使用了JVM所致,之前的分析不够深入,见谅.