2016-03-11 27 views
1

我知道,在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 

(我稱這爲雜牌一些雜牌,因爲它既要求用戶輸入陌生參數以及因爲它爲具有多個輸入的函數的參數序列犯規)

+1

在你的'doit'函數中,'inputname'從哪裏來,'name'如果不是'struct'呢?我沒有真正關注你的意見和目的。 – Matt

+0

你可以在這裏提供更多關於你在做什麼的背景嗎? – Suever

+0

如果它是一個結構體的字段,它有什麼關係?你是否試圖使用'assignin'作爲代碼中的某個地方將結果推回給它們? – Suever

回答

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 

從那裏你可以嘗試解析代碼行來獲取單獨的參數名稱。

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))); 
+0

您可以使用'myloc = fullfile(getenv('appdata'),'MathWorks','MATLAB',version(' - release'),'History.xml')' – Daniel

+1

您不能依靠命令歷史記錄立即刷新到文件,最好使用'com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory',它返回一個帶有命令的字符串的javaArray。 – Daniel

相關問題