从元胞数组中获取字符串作为 matlab 工作区中变量的名称
Take string from cell array for name of variable in matlab workspace
我的实验中有大量 .csv 文件 (200+),之前我一直在单独阅读它们,而且对于我的数据处理的后续步骤,这是一项乏味的工作。
co_15 = csvread('CO_15K.csv',5,0);
co_25 = csvread('CO_25K.csv',5,0);
co2_15 = csvread('CO2_15K.csv',5,0);
co2_80 = csvread('CO2_80K.csv',5,0);
h2o_15 = csvread('H2O_15K.csv',1,0);
etc.....
所以我想在我的代码开头创建一个像这样的单元格,然后是一个自动读取它们的 for 循环。
input = {'co_15' 5;'co_25' 5;...
'co2_15' 5; 'co2_80' 5;...
'h2o_15' 1; 'h2o_140' 1;...
'methanol_15' 5;'methanol_120' 5;'methanol_140' 5;...
'ethanol_15' 5;'ethanol_80' 1;'ethanol_140' 5;...
'co2_ethanol_15' 5 ;'co2_ethanol_80' 5;...
'h2o_ethanol_15' 1 ;'h2o_ethanol_140' 1;...
'methanol_ethanol_15' 5;'methanol_ethanol_120' 5;'methanol_ethanol_140' 5};
for n = 1:size(input,1)
input{n,1} = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
此代码中的单元格是 19 行和 2 列,行是所有文件,列将包含处理数据的参数。现在我找不到解决方案的问题是我的第一列是一个字符串名称,我希望该字符串名称是 csvread 将其数据写入其中的变量的名称,但我现在设置它的方式只是覆盖包含 csv 数据的单元格第一列中的字符串。更清楚地说,我希望我的 matlab 工作区在包含我的 csv 文件数据的第一列中具有字符串名称的变量。我该如何解决?
您实际上不想这样做。 Even the Mathworks will tell you not to do this。如果您尝试像这样使用变量名来跟踪相关数据,总是一种更好的数据结构来保存您的数据。
一种方法是使用元胞数组
data = cell(size(input(:,1)));
for n = 1:size(input,1)
data{n} = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
另一个不错的选择是使用 struct
。您可以有一个 struct
具有与您的数据相对应的动态字段名称。
data = struct();
for n = 1:size(input,1)
data.(input{n,1}) = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
或者实际创建一个结构数组,并在结构中保存名称和数据。
for n = 1:size(input, 1)
data(n).name = input{n,1};
data(n).data = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
如果您绝对坚持这样做(同样,不 推荐),那么您可以使用 eval
:
for n = 1:size(input, 1)
data = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
eval([input{n, 1}, '= data;']);
end
我的实验中有大量 .csv 文件 (200+),之前我一直在单独阅读它们,而且对于我的数据处理的后续步骤,这是一项乏味的工作。
co_15 = csvread('CO_15K.csv',5,0);
co_25 = csvread('CO_25K.csv',5,0);
co2_15 = csvread('CO2_15K.csv',5,0);
co2_80 = csvread('CO2_80K.csv',5,0);
h2o_15 = csvread('H2O_15K.csv',1,0);
etc.....
所以我想在我的代码开头创建一个像这样的单元格,然后是一个自动读取它们的 for 循环。
input = {'co_15' 5;'co_25' 5;...
'co2_15' 5; 'co2_80' 5;...
'h2o_15' 1; 'h2o_140' 1;...
'methanol_15' 5;'methanol_120' 5;'methanol_140' 5;...
'ethanol_15' 5;'ethanol_80' 1;'ethanol_140' 5;...
'co2_ethanol_15' 5 ;'co2_ethanol_80' 5;...
'h2o_ethanol_15' 1 ;'h2o_ethanol_140' 1;...
'methanol_ethanol_15' 5;'methanol_ethanol_120' 5;'methanol_ethanol_140' 5};
for n = 1:size(input,1)
input{n,1} = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
此代码中的单元格是 19 行和 2 列,行是所有文件,列将包含处理数据的参数。现在我找不到解决方案的问题是我的第一列是一个字符串名称,我希望该字符串名称是 csvread 将其数据写入其中的变量的名称,但我现在设置它的方式只是覆盖包含 csv 数据的单元格第一列中的字符串。更清楚地说,我希望我的 matlab 工作区在包含我的 csv 文件数据的第一列中具有字符串名称的变量。我该如何解决?
您实际上不想这样做。 Even the Mathworks will tell you not to do this。如果您尝试像这样使用变量名来跟踪相关数据,总是一种更好的数据结构来保存您的数据。
一种方法是使用元胞数组
data = cell(size(input(:,1)));
for n = 1:size(input,1)
data{n} = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
另一个不错的选择是使用 struct
。您可以有一个 struct
具有与您的数据相对应的动态字段名称。
data = struct();
for n = 1:size(input,1)
data.(input{n,1}) = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
或者实际创建一个结构数组,并在结构中保存名称和数据。
for n = 1:size(input, 1)
data(n).name = input{n,1};
data(n).data = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
end
如果您绝对坚持这样做(同样,不 推荐),那么您可以使用 eval
:
for n = 1:size(input, 1)
data = csvread(strcat(input{n,1},'k.csv'),input{n,2},0);
eval([input{n, 1}, '= data;']);
end