1

我使用 scilab,但是在一个项目期间,scilab 必须处理大量的变量。我想知道我是否可以执行以下操作

var_list = who_user();
for _var_ = var_list do
  if _var_ is global then
    writetofile(human_readablefile, _var_)
  end
end
clear()

当然这是一个伪代码,在我实现它之前我有几个问题。

  1. 我无法让 var_list = who_user() 工作。所以我相信这个函数不会返回任何东西。我不愿意侵入“who_user”宏本身的代码。有没有其他方法可以在另一个变量中获取用户变量列表?

  2. 有没有办法从中找到全局变量?

  3. 如果没有,那么 scilab 中有哪些内存管理技术?

4

1 回答 1

1

我能够回答您的第一个问题:

通过对 who_user 函数本身的轻微修改:

function nams = who_user1()
  //get user variables
  [nams,mem]=who('get'); //get all variables
  p=predef(); //number of system variable
  st=stacksize()
  nams=nams(1:$-p+1);mem=mem(1:$-p+1);
  //modifiable system variables
  excluded=['demolist','scicos_pal','%scicos_menu',..
    '%scicos_short','%helps','%helps_modules','MSDOS','who_user','%scicos_display_mode', ...
      '%scicos_help'];
  ke=grep(nams,excluded)
  nams(ke)=[];mem(ke)=[];

  n=size(nams,1);
  if n==0 then return,end

  //format names on n*10 characters
  ll=length(nams)+2;m=int((ll-1)/10)+1;
  for k=1:max(m)
    ks=find(m==k);
    if ks<>[] then nams(ks)=part(nams(ks),1:(k*10));end
  end
endfunction

这个函数应该给你你想要的列表(我已经把名字修改为 who_user1)。

您可以使用 isglobal() 函数确定特定变量是否为全局变量,但您需要将变量传递给 isglobal(),而不是作为变量名称的字符串。我上面列出的函数返回一个字符串向量。

您可以尝试的另一种方法是重写上述函数以使用 varargout 直接返回变量(而不是它们的名称),然后测试它们是否是全局变量。

于 2010-11-01T21:31:55.850 回答