2011-07-13 191 views
13

我在Matlab中有一個函數,它有一些變量。我需要打印出variable_names(如果發生異常等)。我知道inputname函數,但它僅適用於input_arguments。在Matlab中打印變量名稱

mat = [ 1 2 ; 3 4 ] ; 

% disp(['Error in var: ' ??(a)]) 
% desired ouput: Error in var: mat  (and NOT 1 2 ; 3 4!) 

謝謝!

+0

什麼是'(一)'應該是什麼? – gnovice

+1

@gnovice:我認爲他的意思是說'mat'而不是'a' – Amro

+0

只是出於好奇,這個練習的用例是什麼?我的意思是變量名實際上在這種狀態下是已知的。什麼可以防止鍵入'disp('var in:'錯誤')'?不要把它當作批評,而是作爲一個真正感興趣的問題。 – patrik

回答

13

Matlab的基本上是不會讓你這樣做。然而,你可以寫一個輔助函數來減輕你的痛苦在創造這樣的輸出:

function disp_msg_var(msg, v) 
    disp([msg inputname(2)]); 
end 

,你可以調用像這樣在您的情況:

disp_msg_var('Error in: ', a); 

你可以閱讀的話題更多的討論在Mathworks forum

此外,要列出所有具有值的當前變量,您可以使用who函數,但這不是您提出的問題。

1

如果要打印出函數中存在的變量,可以使用函數WHO。下面是使用一個簡單的函數test.m一個例子:

function test 
    a = 1; 
    b = 2; 
    varNames = who(); 
    disp(sprintf('%s ','Variables are:',varNames{:})); 
    c = 3; 
    d = 4; 
    varNames = who(); 
    disp(sprintf('%s ','Variables are:',varNames{:})); 
end 

運行這會給你以下的輸出:

>> test 
Variables are: a b 
Variables are: a b c d varNames 
+0

-1這不是什麼OP要求 – Amro

+0

@Amro:我認爲這是。 「我需要打印出variable_name ** s **(如果發生異常等)。」這聽起來像他們想要列出異常發生後存在的變量。其他人所做的解釋沒有什麼意義,因爲如果OP已經知道哪個變量導致了異常,那麼他們已經知道它的名字,並且不必從任何地方得到它。 – gnovice

+1

我同意OP的請求有點奇怪(如果你想獲得一個字符串的變量名,那麼當你輸入代碼時你已經知道它了)。我能想到的唯一用例是簡化錯誤報告或調試。也許這可以被認爲是某種反射能力... – Amro

16
[email protected](x) inputname(1); 
disp(['Error in var: ' varname(mat)]) 
+0

+1我添加了此解決方案的單行版本 – Amro

6

我加入另一種解決方案混合(一個班輪):

function myFunction() 
    mat = [1 2; 3 4]; 
    disp(['Error in var: ' feval(@(x)inputname(1),mat)]) 
end 

,輸出:

Error in var: mat