相似于“inputname”的变通方法返回结构名称?

时间:2016-03-11 15:12:50

标签: matlab

我知道,在MATLAB函数中,inputname(k)将返回第k个参数 iff 参数是变量名。有没有办法编写一些解析代码,当该参数是一个结构时,可以检索完整的输入参数,例如foo.bar?我希望能够做到这一点的原因是我正在编写一些通用的工具,其中输入可以是命名变量或命名结构元素。

我的主要目的是能够存储和返回输入段作为函数返回的结构或其他变量的一部分。这是一个“监管链”功能,使我或其他人更容易验证用于生成输出数据集的源数据集。

我不希望用户必须在外部进行自我解析,或者不得不处理一些像

这样的问题。
function doit(name,fieldname)
    if(exist('fieldname','var'))
        name = name.(fieldname);
        myinput = [inputname(1),inputname(2)];
    else
       myinput = inputname(1);
    end

% do the function stuff

(我称之为kludge,因为它既要求用户输入奇怪的参数,又因为它会使具有多个输入的函数的参数序列搞乱)

2 个答案:

答案 0 :(得分:3)

在传递结构时,语言不支持获取输入名称。原因可能是x.a在内部调用subsref,它返回一个新变量,所有上下文都丢失了。您唯一的可能是使用调试工具并解析代码。没有其他选择。

function x=f(varargin)
[ST, I] = dbstack('-completenames', 1);
if numel(ST)>0
    fid=fopen(ST(1).file,'r');
    for ix=2:ST(1).line;fgetl(fid);end
    codeline=fgetl(fid);
    fclose(fid);
    fprintf('function was called with line %s\n',codeline);
else
    fprintf('function was called from base workspace\n');
end
end

从那里你可以尝试解析代码行以获得各个参数名称。

答案 1 :(得分:0)

比丹尼尔的做法更加丑陋,并且可能会在错误的操作系统上崩溃,但这里有一个可以检索第一个参数的黑客攻击;轻松调整以检索所有参数。

  [~,myname] = system('whoami');
    myname = strtrim(myname(4:end)); % removes domain tag in my Windows envir
    % sorry about " \' " fouling up SO's color parsing
    myloc = ['C:\Users\' , myname ,  '\AppData\Roaming\MathWorks\MATLAB\R2015a\History.xml'] ;
    f = fopen(myloc,'r');
    foo = fscanf(f,'%s');
    fclose(f);
    pfoo = findpat(foo,'myFunctionName'); 
    % just look for the last instance
    namstart = find(foo(pfoo(end):(pfoo(end)+30)) =='(',1) +pfoo(end);
    % catch either ')' or ',' 
    namend(1) = find(foo((namstart):end)== ')',1) -2 +namstart;
    if numel(find(foo((namstart):end)== ',',1)),
         namend(2) = find(foo((namstart):end)== ',',1) -2 +namstart;
    end
    thearg = foo(namstart:(min(namend)) );