Matlab 努力索引到使用eval函数生成的列向量中

Matlab 努力索引到使用eval函数生成的列向量中,matlab,Matlab,我有几个表,每个表都有大量的数据(每个表20MB)。让我们将它们称为表1、表2、表3等。这些表的结构类似,具有相同的列标题(但行数不同)。比如说属性A,属性B,等等 我感兴趣的是对每个表的属性_B进行计算。这些计算涉及通过属性_B循环 我首先创建一个包含所有表名的主列表 Table_List = [Table_1, Table_2, ... Table 10]; 现在我可以迭代这个过程并执行我的计算。使用eval和我的列向量名作为当前_表的值的函数,执行单个计算效果很好: for Curren

我有几个表,每个表都有大量的数据(每个表20MB)。让我们将它们称为表1、表2、表3等。这些表的结构类似,具有相同的列标题(但行数不同)。比如说属性A,属性B,等等

我感兴趣的是对每个表的属性_B进行计算。这些计算涉及通过属性_B循环

我首先创建一个包含所有表名的主列表

Table_List = [Table_1, Table_2, ... Table 10];
现在我可以迭代这个过程并执行我的计算。使用eval和我的列向量名作为当前_表的值的函数,执行单个计算效果很好:

for Current_Table = Table_List
    Peak_Value = max(eval(strcat(Current_Table,"Attribute_C")));
当我执行需要遍历列向量的计算时,我遇到了麻烦。例如,以下操作失败

for Current_Table = Table_List
    for i = 1:length(eval(strcat(Current_Table,".Attribute_B")
        X = X + eval(strcat(Current_Table,".Attribute_B"))(i);
当我试图将计算的列与所需的索引值I相结合时,MATLAB会挂断。有办法做到这一点吗


我知道,如果我对所有数据进行单一结构,这将更加容易(不使用字符串列表,而是实际组合数据)。我希望在不重写数据的情况下遍历每个表。

正如excaza所指出的,在此类问题中使用
eval
是非常不可取的。一种更安全、更优雅的方法是使用结构

下面是一个使用结构的程序示例,它应该对您有用

clear
% Intialize the structure that will hold all the tables
TABLES = struct;

% List of table names
table_names = {'Table_1' 'Table_2' 'Table_3'};

% Number of tables
nTables = length(table_names);

% Fill the tables with some data
% TABLES can also be nested structures with more than one data item in them in
% each substructure
for itb=1:nTables
    % TABLES.(table_names{itb}) = rand(3);
    % Load from files with names Table_N.txt
    TABLES.(table_names{itb}) = load([table_names{itb},'.txt']);
end

% Perform operations on the components
for jtb=1:nTables
   % Using a temporary array
   %     temp = []; 
   %     temp = TABLES.(table_names{jtb});
   %     A(jtb) = max(max(temp));
   %     B(jtb) = temp(2,1);
   % .. and such
   % Or directly     
     A(jtb) = max(max(TABLES.(table_names{jtb})));
     B(jtb) = TABLES.(table_names{jtb})(2,1);
 end 
您有一个名称列表,可以使用它们在名为
TABLES
的主结构内部创建嵌套结构或任何其他内容(如此处的数组)。您可以从文件中填充此数据,在本例中,我只使用了
rand
。收集数据和对其进行任何操作都可以通过循环完成。在第二个循环中,您有一个示例,说明如何使用临时数组直接或间接地操作数据


这是一个相对宽泛的话题,所以请随意提问,我将把它们添加到我的答案中。

正如excaza指出的,在这类问题中使用
eval
是非常不鼓励的。一种更安全、更优雅的方法是使用结构

下面是一个使用结构的程序示例,它应该对您有用

clear
% Intialize the structure that will hold all the tables
TABLES = struct;

% List of table names
table_names = {'Table_1' 'Table_2' 'Table_3'};

% Number of tables
nTables = length(table_names);

% Fill the tables with some data
% TABLES can also be nested structures with more than one data item in them in
% each substructure
for itb=1:nTables
    % TABLES.(table_names{itb}) = rand(3);
    % Load from files with names Table_N.txt
    TABLES.(table_names{itb}) = load([table_names{itb},'.txt']);
end

% Perform operations on the components
for jtb=1:nTables
   % Using a temporary array
   %     temp = []; 
   %     temp = TABLES.(table_names{jtb});
   %     A(jtb) = max(max(temp));
   %     B(jtb) = temp(2,1);
   % .. and such
   % Or directly     
     A(jtb) = max(max(TABLES.(table_names{jtb})));
     B(jtb) = TABLES.(table_names{jtb})(2,1);
 end 
您有一个名称列表,可以使用它们在名为
TABLES
的主结构内部创建嵌套结构或任何其他内容(如此处的数组)。您可以从文件中填充此数据,在本例中,我只使用了
rand
。收集数据和对其进行任何操作都可以通过循环完成。在第二个循环中,您有一个示例,说明如何使用临时数组直接或间接地操作数据


这是一个相对宽泛的话题,所以请随意提问,我会将它们添加到我的答案中。

当然,这是您不应该首先使用
eval
的众多原因之一。重构你的代码。当然,这是你不应该首先使用
eval
的众多原因之一。重构您的代码。感谢您的回复和参与讨论的意愿。这是我的问题——当你创建你的结构时,你不是在复制数据吗?我希望避免将200MB+的数据重新写入另一个变量,并使我的工作区大小加倍。这就是我(无可否认)古怪做法的动机。你的数据在文件中吗?一系列文件?您可以直接将其加载到结构中,就我所知,它不应该复制它。如何加载和处理数据?我添加了一个简单的从文件加载选项。如果加载更复杂,可以先加载到临时数组中,然后再加载到结构中。由于数据大小不相等,请记住(以防万一)每次清空数组,如第二个循环中的
temp=[]
。我想说,如果您直接加载,您将不会有任何副本。如果您使用临时数组加载,则每次将有一个表的副本。感谢您的回复和参与讨论的意愿。这是我的问题——当你创建你的结构时,你不是在复制数据吗?我希望避免将200MB+的数据重新写入另一个变量,并使我的工作区大小加倍。这就是我(无可否认)古怪做法的动机。你的数据在文件中吗?一系列文件?您可以直接将其加载到结构中,就我所知,它不应该复制它。如何加载和处理数据?我添加了一个简单的从文件加载选项。如果加载更复杂,可以先加载到临时数组中,然后再加载到结构中。由于数据大小不相等,请记住(以防万一)每次清空数组,如第二个循环中的
temp=[]
。我想说,如果您直接加载,您将不会有任何副本。如果使用临时数组加载,则一次将有一个表的副本。