通过字符串名称访问变量

11

我需要将实验数据加载到 scicoslab 中,它是一个(相当糟糕设计的)克隆分支版本的scilab,支持图形建模。网上的文档非常贫乏,但它与scilaboctave相似。

我需要处理的数据包含在一定数量的文本文件中:Data_005Data_010,…,Data_100。每个文件都可以使用loadmatfile命令的-ascii标志进行加载。

问题在于loadmatfile("foo", "-ascii")会将文件foo.mat加载到名为foo的变量中。为了循环处理数据文件,我需要做类似以下的事情:

for i = [5:5:100]
    name = sprintf("Data_%02d", i);
    loadmatfile(name, "-ascii");
    x = read_var_from_name(name);
    do_something(x);
end

我想查找一个内置的read_var_from_name函数,能够让我通过字符串访问内部符号表。您知道是否存在类似的函数吗?

注:

  1. 如果文件是ascii格式,则无法覆盖此行为。
  2. 在这个阶段,我也可以使用Octave(不涉及图形建模),尽管它的行为方式相同。
3个回答

11
>> foo = 3.14; name = 'foo'; eval(name)

foo =

    3.1400

上述代码在MATLAB中可行,而Scilab的文档也表明它也有一个eval函数。不过我不确定我是否正确理解了你的意思。


9

@arne.b有一个好的答案。

在您的情况下,您也可以在Matlab中执行此操作:

a=load('filename.mat')
x=a.('variable_name')

1
只是想说(作为一个来自编程背景的人,其中eval()被认为是邪恶的),感谢您指出这一点;我不知道这种语法存在! - miken32
@miken32 eval确实很危险。 - Oli

0

让我们逐一审视你的观点:

  1. 在我看来,这是一种不准确的介绍软件的方式。ScicosLab不是Scilab的克隆,而是它的一个分支。ScicosLab团队(INRIA)是制作scocos(现在在Scilab开发线中称为xcos)的人。从Scilab v4开始,Scilab团队决定放弃Tcl/tk转向Java,但SciccosLab/scicos团队离开了,继续使用该语言(Tcl)及其图形用户界面设计包(tk)。总的来说,ScocosLab社区值得赞扬,因为整个Scilab文档和支持都不是很好。:) (有关Scilab和分支的更多信息here
  2. 关于技术问题,我不确定你想要实现什么,Scilab/ScicosLab仍然有eval函数,基本上可以做到你想要的。然而,这个函数将被弃用,取而代之的是evstr。还有一个值得研究的execstr函数。
  3. loadmatfile,据我所知,“尝试”将MATLAB的变量定义(MATLAB的专有表格式)加载到Scilab工作区中。例如,如果有一个变量foo,它将“尝试”创建变量foo并从MATLAB脚本中加载其值。请参考example。我会在for循环中创建一个变量x(i) = foo。再次说明,你的问题不是完全清楚的。
  4. 顺便说一句,也许你可以考虑将数据导出为CSV而不是.mat文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接