matlab中一个由于文件检索无法和函数并行而引发的问题

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所致,之前的分析不够深入,见谅.

猜你喜欢

转载自blog.csdn.net/weisuowangshuai/article/details/78535351