matlab,循环执行后自动删除索引变量
Posted
技术标签:
【中文标题】matlab,循环执行后自动删除索引变量【英文标题】:Matlab, automatically delete the index variable after the execution of a loop 【发布时间】:2012-04-08 16:30:11 【问题描述】:在 Matlab 上,当我使用“for...end”循环时,在循环完全执行后,索引变量仍然存在于我的工作区中。我希望它被自动删除,因为它在循环之外不再相关并且会污染工作空间。
例如,在下面的代码中,变量“i”在循环执行后仍然存在。因为它应该是一个局部变量,所以我希望它自动删除,而无需我明确地这样做。
List = [1 2 3 4] ;
for i = List
fprintf('value = %i\n', i) ;
end
% "i" still exists, while its outside of its context
clear i; % I would like to avoid doing this everytime I exit a for..end
我知道这更像是一个美学问题而不是一个错误,但为了更容易理解我的程序的结果,我希望这些“临时”变量在我退出它们的上下文时消失。
到目前为止,我只能通过重用这些临时变量来减少它们的数量。
编辑:
似乎没有真正的解决方案可以自动删除那些“临时”变量。 避免这些变量的最接近的方法是:
避免循环
在函数中创建循环,函数的变量是本地的,不会进入工作区。
【问题讨论】:
无关:我建议使用ii
作为索引变量以避免破坏i
(虚数单位)。
@nibot: +1,即使你也可以养成将虚数单位写成1i
的习惯(注意缺少的空格),如果你使用它比循环变量少得多.. .
是的,没错;我最近才知道 1i。
【参考方案1】:
如果你真的想确保你的一些变量的范围有限,并且你想避免调用clear
,你可以使用nested functions。请注意,这可能对可读性没有帮助,而且它更多键入而不是调用clear
。但是,它确实确保主函数工作区中的唯一变量是您想要/需要保留的变量。
function doSomething
List = [1 2 3 4] ;
runLoopOnList()
%# some other code here
%# nested functions
function runLoopOnList
%# i, and any other variable defined here
%# will not appear in the workspace
%# in contrast, all variables in the workspace
%# are visible and can be changed by the nested function
%# If a nested function should assign a new important
%# variable in the main workspace, have it return
%# and output.
for i = List
fprintf('value = %i\n', i) ;
end
end %# nested function
end %# main function
【讨论】:
您也可以使用assignin('base', 'abc', abc)
在主工作区中分配一个变量。【参考方案2】:
看!没有循环,没有迭代变量!
fprintf('value = %i\n', List)
而且,虽然我在这里,但我不同意您的 i
是一个临时变量;您已将其放在工作区中,因此它本质上是全局的。如果您不希望它“污染”工作空间,请将其放在另一个上下文中(例如,在函数内部)。
是的,我知道 Matlab 有一个全局变量的概念,它与工作区变量略有不同,但在这里不太相关。
【讨论】:
谢谢,我从来没想过要这样写 fprintf。有没有办法(不使用函数)使用变量而不将其放入工作区? @olchauvin:不是真的。在跟踪错误等时,它有时会很有用。 好的,这适用于这个特定的例子。一般来说,答案是:不,这是不可能的? @Bernhard:看看我们目前得到的答案,似乎除了创建一个函数并在其中运行循环之外,这是不可能的。我还没有找到像我们在 C 中那样(将 放在代码的一部分周围)来为变量创建上下文的东西。以上是关于matlab,循环执行后自动删除索引变量的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch生命周期ILM若干时间后自动删除索引index
Elasticsearch生命周期ILM若干时间后自动删除索引index