将表或数组名称定义为Matlab中先前定义的字符串的名称

时间:2015-01-11 23:11:16

标签: arrays matlab

所以我想优化我的代码,以便我可以浏览一个数组,如

{'one','two','three'} 

并创建定义为表或数组的相应变量 比如

one = table()
two = table()
three = table()

我知道eval函数但是我想在循环中使用这个函数s.t我在创建它之后立即将值分配给新变量

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,给定一个只由字符串组成的单元格数组,你希望在工作区中创建变量,其中每个变量都使用这个单元格数组中的名称声明为字符串。

您可以使用eval,但我会推荐eval以外的其他内容。应避免eval,而不是重复这些原因,您可以阅读Loren Shure's article on eval

无论如何,我建议您将这些变量作为动态字段放在结构中。做这样的事情:

s = struct()
strs = {'one', 'two', 'three'};
for idx = 1 : numel(strs)
    s.(strs{idx}) = table();
end

在这种情况下,s将是一个结构,您可以通过点运算符访问该变量。在这种情况下,您可以通过以下方式访问相应的变量:

d = s.one; %// or
d2 = s.two; %// or
d3 = s.three;

如果你想将它放入一个函数本身,你可以把它放到一个像这样的函数中:

function [s] = createVariables(strs)
s = struct();
for idx = 1 : numel(strs)
    s.(strs{idx}) = table();
end

此函数将接收字符串的单元格数组,并输出一个结构,其中包含与您输入的字符串数组相对应的字段。因此,您可以这样调用它:

strs = {'one', 'two', 'three'};
s = createVariables(strs);

但是,如果你真的真的......我的意思是......想要使用eval,你可以像这样创建你的工作空间变量:

strs = {'one', 'two', 'three'};
for idx = 1 : numel(strs)
    eval([strs{idx} ' = table();']);
end

要将其放入函数中,请执行以下操作:

function [] = createVariables(strs)
for idx = 1 : numel(strs)
    eval([strs{idx} ' = table();']);
end

但是,请注意,如果运行上述函数,这些变量将仅在运行函数的范围内定义。当函数退出时,会看到这些变量。如果要运行函数以便在运行函数后在工作空间中定义变量,则eval不适合您。因此,您应该坚持我在本文开头讨论过的动态字段方法。

在任何情况下,这将创建onetwothree作为初始化为空表的工作空间变量。但是,我将与您争辩说,第一行代码比第二段代码更容易阅读,这是为什么应该避免eval的主要争论点之一。如果你足够长时间地盯着第二段代码,那么你当然可以看到我们想要实现的目标,但是如果你阅读了第一段代码,就可以更清楚地确定其目的。