如何在MATLAB的工作空间中读取顺序命名的变量

时间:2014-10-16 22:30:10

标签: matlab

我有闪电数据,我想在循环中读取它们,对每个变量执行行索引;

    row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180... 
| (-180 < M(:, 4) & M(:, 4) <= -120)); filtered_M = M(row_idx, :);

其中M是一个虚拟变量,已经赋值变量,hr是小时(我已经指定为全局变量)。

变量命名为A(年)(月)(日),例如,2013年1月1日的数据为A20130101,2013年12月29日的数据为A20131229。

我的目标是读取for循环中的所有变量。当读取每个变量时,我想对它们执行行索引操作(如上所述)并存储操纵变量 例如,如果读取变量是A20130201,那么我想将操纵变量存储为filtered_A20130201。

我很难读取变量并存储生成的矩阵。

我试过了,

for k = 1:n  
  M = A2013010k;  
  row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180 ...  
 | (-180 < M(:, 4) & M(:, 4) <= -120));  
  filtered_M = M(row_idx, :);  
  filtered_A2013010k = filtered_M;  
end

但是我意识到我的努力是徒劳的,因为我不熟悉MATLAB编码。

2 个答案:

答案 0 :(得分:1)

您不能简单地使用数字变量来构造直接变量名称。解决方法是构造变量名称的字符串,然后调用函数eval

例如:

for k = 1:n
   varName = ['A201401' sprintf('%02d',k)] ;
   eval( ['M=' varName ] ) ;

   row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180 ...  
 | (-180 < M(:, 4) & M(:, 4) <= -120));  

   filtered.(varName) = M(row_idx, :) ;
end

虽然不建议使用eval

为避免遇到同样的问题(必须使用eval)来存储过滤后的变量,我将它们分配到一个结构中。 matlab结构可以有dynamic field,这意味着你可以根据字符串(易于构造或以编程方式增加)构造字段的名称。

如果您想了解更多信息,请查看this question的已接受答案。它与您的要求非常相似,答案得到了很好的解释。

答案 1 :(得分:1)

在变量序列中拥有一系列数据通常是不好的做法,就像你对A20130101等一样。

如果无法提供帮助,您可以使用eval作为解决方法:

for k = 1:n
  eval(sprintf('M = A201301%02d', k));
  row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180 ...  
 | (-180 < M(:, 4) & M(:, 4) <= -120));  
  filtered_M = M(row_idx, :);  
  eval(sprintf('filtered_A201301%02d = filtered_M', k));
end

有关详细信息和最佳做法,请参阅this page