2011-07-13 187 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